Udostępnij za pomocą


Błąd kompilatora C7553

asembler wbudowany nie jest obsługiwany w a lambda

Uwagi

W wersjach programu Visual Studio przed programem Visual Studio 2017 w wersji 15.9 użycie wbudowanego asemblera w środowisku lambda może prowadzić do uszkodzenia (rejestru adresów zwrotnych ebp ) w czasie wykonywania. Złośliwy atakujący może skorzystać z tego scenariusza. Wbudowany asembler jest obsługiwany tylko w architekturze x86, a interakcja między wbudowanym asemblerem a resztą kompilatora jest słaba. Biorąc pod uwagę te fakty i charakter problemu, najbezpieczniejszym rozwiązaniem tego problemu było uniemożliwienie asemblera wbudowanego w wyrażeniu lambda.

Jedynym użyciem wbudowanego asemblera w wyrażeniu lambda, które znaleźliśmy "na wolności", było przechwycenie adresu zwrotnego. W tym scenariuszu można przechwycić adres zwrotny na wszystkich platformach, używając wbudowanego kompilatora _ReturnAddress().

Błąd kompilatora C7553 występuje w programie Visual Studio, począwszy od programu Visual Studio 2017 w wersji 15.9.

Przykład

Poniższy kod generuje kod C7553 w programie Visual Studio 2017 w wersji 15.9 lub nowszej:

#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;
}

Aby uniknąć błędu, przenieś kod zestawu do nazwanej funkcji, jak pokazano w poniższym przykładzie:

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