Condividi tramite


Errore del compilatore C7553

l'assembler inline non è supportato in un'espressione lambda

Osservazioni:

Nelle versioni di Visual Studio precedenti a Visual Studio 2017 versione 15.9, l'uso di assembler inline all'interno di un'espressione lambda potrebbe causare il danneggiamento di (registro degli ebp indirizzi restituiti) in fase di esecuzione. Un utente malintenzionato potrebbe trarre vantaggio da questo scenario. L'assembler inline è supportato solo su x86 e l'interazione tra l'assembler inline e il resto del compilatore è scarsa. Dato questi fatti e la natura del problema, la soluzione più sicura a questo problema era quella di impedire l'assembler inline all'interno di un'espressione lambda.

L'unico caso d'uso dell'assembler inline all'interno di un'espressione lambda rilevato è stato un uso per l'acquisizione dell'indirizzo di restituzione. In questo scenario è possibile acquisire l'indirizzo del mittente in tutte le piattaforme, usando un elemento _ReturnAddress() intrinseco del compilatore.

L'errore del compilatore C7553 si verifica in Visual Studio a partire da Visual Studio 2017 versione 15.9.

Esempio

Il codice seguente produce C7553 in Visual Studio 2017 15.9 e versioni successive:

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

Per evitare l'errore spostare il codice dell'assembly in una funzione con nome, come illustrato nell'esempio seguente:

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