Freigeben über


Compilerfehler C7553

Inlineassembler wird in einer Lambda-Funktion nicht unterstützt.

Hinweise

In Versionen von Visual Studio vor Visual Studio 2017, Version 15.9, kann die Verwendung von Inline-Assembler innerhalb einer Lambda-Funktion zur Laufzeit zu einer Beschädigung ebp (des Rückgabeadressregisters) führen. Ein böswilliger Angreifer könnte sich dieses Szenario zunutze machen. Der Inlineassembler wird nur bei x86 unterstützt, und zwischen dem Inlineassembler und den übrigen Elementen des Compilers findet keine zufriedenstellende Interaktion statt. Aufgrund dieser Tatsachen und der Art des Problems bestand die sicherste Lösung darin, den Inlineassembler innerhalb eines Lambdaausdrucks nicht zuzulassen.

Die einzige Verwendung eines Inlineassemblers innerhalb eines Lambdaausdrucks, die in der Praxis gefunden wurde, war das Erfassen der Rückgabeadresse. In diesem Szenario können Sie die Rückgabeadresse auf allen Plattformen erfassen, indem Sie einfach die intrinsische Compilerfunktion _ReturnAddress() verwenden.

Compilerfehler C7553 tritt in Visual Studio ab Visual Studio 2017, Version 15.9, auf.

Beispiel

Der folgende Code erzeugt C7553 in Visual Studio 2017 15.9 und höheren Versionen:

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

Verschieben Sie den Assemblycode wie im folgenden Beispiel gezeigt in eine benannte Funktion, um diesen Fehler zu vermeiden:

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