Ошибка компилятора C7553
встроенный сборщик не поддерживается в лямбда-лямбда-объекте
Замечания
В версиях Visual Studio до Visual Studio 2017 версии 15.9 использование встроенного сборщика в лямбда-сборке может привести к повреждению ebp
(регистра адресов возврата) во время выполнения. Злоумышленник может воспользоваться этим сценарием. Встроенный ассемблер поддерживается только на 32-разрядной (x86) платформе и плохо взаимодействует с остальными функциями компилятора. Учитывая эти факты и характер проблемы, самым надежным решением было запретить встроенный ассемблер в лямбда-выражении.
Мы нашли "в реальной жизни" только один вариант применения встроенного ассемблера в лямбда-выражении, а именно получение обратного адреса. В этом сценарии можно получить обратный адрес на всех платформах, просто используя _ReturnAddress()
в компиляторе.
Ошибка компилятора C7553 возникает в Visual Studio, начиная с Visual Studio 2017 версии 15.9.
Пример
Следующий код создает C7553 в Visual Studio 2017 15.9 и более поздних версиях:
#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;
}
Чтобы избежать этой ошибки, переместите код сборки в именованную функцию, как показано в следующем примере:
#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());
}