Sdílet prostřednictvím


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