Поделиться через


Ошибка компилятора C7553

встроенный сборщик не поддерживается в лямбда-лямбда-объекте

Замечания

В версиях Visual Studio до Visual Studio 2017 версии 15.9 использование встроенного сборщика в лямбда-сборке может привести к повреждению ebp (регистра адресов возврата) во время выполнения. Злоумышленник может воспользоваться этим сценарием. Встроенный ассемблер поддерживается только на 32-разрядной (x86) платформе и плохо взаимодействует с остальными функциями компилятора. Учитывая эти факты и характер проблемы, самым надежным решением было запретить встроенный ассемблер в лямбда-выражении.

Мы нашли "в реальной жизни" только один вариант применения встроенного ассемблера в лямбда-выражении, а именно получение обратного адреса. В этом сценарии можно получить обратный адрес на всех платформах, просто используя _ReturnAddress() в компиляторе.

Ошибка компилятора C7553 возникает в Visual Studio, начиная с Visual Studio 2017 версии 15.9.

Пример

Следующий код создает C7553 в Visual Studio 2017 15.9 и более поздних версиях:

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

Чтобы избежать этой ошибки, переместите код сборки в именованную функцию, как показано в следующем примере:

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