Chyba kompilátoru C7553
Vložený assembler se v lambda nepodporuje.
Poznámky
Ve verzích sady Visual Studio před sadou Visual Studio 2017 verze 15.9 může použití vloženého assembleru v rámci lambda vést k poškození ebp
(registrace zpáteční adresy) za běhu. Útočník se zlými úmysly by mohl tento scénář využít. Vložený assembler je podporován pouze na platformě x86 a interakce mezi vložený assembler a zbytkem kompilátoru je špatná. Vzhledem k těmto faktům a povaze problému bylo nejbezpečnějším řešením tohoto problému zakázat vložený assembler v rámci výrazu lambda.
Jediným použitím vloženého assembleru ve výrazu lambda, který jsme našli v zástupné oblasti, bylo zachycení zpáteční adresy. V tomto scénáři můžete zachytit zpáteční adresu na všech platformách jednoduše pomocí vnitřní _ReturnAddress()
kompilátoru .
Chyba kompilátoru C7553 se vyskytuje v sadě Visual Studio počínaje sadou Visual Studio 2017 verze 15.9.
Příklad
Následující kód vytvoří C7553 v sadě Visual Studio 2017 15.9 a novějších verzích:
#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;
}
Pokud se chcete této chybě vyhnout, přesuňte kód sestavení do pojmenované funkce, jak je znázorněno v následujícím příkladu:
#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());
}