Erro do compilador C7553

não há suporte para o assembler embutido em um lambda

Comentários

Nas versões do Visual Studio antes do Visual Studio 2017 versão 15.9, o uso do assembler embutido em um lambda pode levar à corrupção do ebp (registro de endereço de retorno) no runtime. Um invasor mal-intencionado possivelmente poderia tirar proveito desse cenário. O assembler embutido só tem suporte no x86, e a interação entre o assembler embutido e o restante do compilador é ruim. Considerando esses fatos e a natureza do problema, a solução mais segura era não permitir o assembler embutido dentro de uma expressão lambda.

O único uso do assembler embutido em uma expressão lambda que encontramos “em condições naturais” era capturar o endereço de retorno. Nesse cenário, é possível capturar o endereço de retorno em todas as plataformas usando simplesmente um _ReturnAddress() intrínseco do compilador.

O erro do compilador C7553 ocorre no Visual Studio a partir do Visual Studio 2017 versão 15.9.

Exemplo

O código a seguir produz C7553 no Visual Studio 2017 15.9 e versões posteriores:

#include <cstdio>

int f()
{
    int y = 1724;
    int x = 0xdeadbeef;

    auto lambda = [&]
    {
        __asm {  // C7553: inline assembler is not supported in a lambda

            mov eax, x
            mov y, eax
        }
    };

    lambda();
    return y;
}

Para evitar o erro, mova o código do assembly para uma função nomeada conforme mostrado no exemplo a seguir:

#include <cstdio>

void g(int& x, int& y)
{
    __asm {
        mov eax, x
        mov y, eax
    }
}

int f()
{
    int y = 1724;
    int x = 0xdeadbeef;
    auto lambda = [&]
    {
        g(x, y);
    };
    lambda();
    return y;
}

int main()
{
    std::printf("%d\n", f());
}