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());
}