Error del compilador C7553

no se admite un ensamblador en línea en una expresión lambda

Comentarios

En las versiones de Visual Studio anteriores a la versión 15.9 de Visual Studio 2017, el uso del ensamblador insertado en una expresión lambda podía provocar daños en ebp (registro de direcciones de retorno) en tiempo de ejecución. Un atacante malintencionado podría sacar provecho de este escenario. El ensamblador alineado solo se admite en x86 y la interacción entre el ensamblador insertado y el resto del compilador es deficiente. Dados estos hechos y la naturaleza del problema, la solución más segura para este problema era impedir el ensamblador insertado en una expresión lambda.

El único uso del ensamblador en línea dentro de una expresión lambda que hemos encontrado de facto fue capturar el remite. En este escenario, se pueden capturar los remites de todas las plataformas utilizando tan solo una función intrínseca de compilador _ReturnAddress().

El error del compilador C7553 se produce en Visual Studio a partir de la versión 15.9 de Visual Studio 2017.

Ejemplo

El código siguiente produce el error C7553 en Visual Studio 2017 15.9 y versiones posteriores:

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

Para evitar el error, mueva el código del ensamblado a una función con nombre, tal como se muestra en el ejemplo siguiente:

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