Bagikan melalui


Compiler Error C7553

perakitan sebaris tidak didukung dalam lambda

Keterangan

Dalam versi Visual Studio sebelum Visual Studio 2017 versi 15.9, penggunaan perakitan sebaris dalam lambda dapat menyebabkan kerusakan ebp (daftar alamat pengembalian) saat runtime. Penyerang jahat mungkin bisa memanfaatkan skenario ini. Perakit sebaris hanya didukung pada x86, dan interaksi antara perakit sebaris dan pengompilasi lainnya buruk. Mengingat fakta-fakta ini dan sifat masalahnya, solusi paling aman untuk masalah ini adalah melarang perakit sebaris dalam ekspresi lambda.

Satu-satunya penggunaan perakit sebaris dalam ekspresi lambda yang telah kami temukan 'di alam liar' adalah untuk menangkap alamat pengembalian. Dalam skenario ini, Anda dapat menangkap alamat pengembalian di semua platform hanya dengan menggunakan intrinsik kompilator _ReturnAddress().

Kesalahan Kompiler C7553 terjadi di Visual Studio mulai dari Visual Studio 2017 versi 15.9.

Contoh

Kode berikut menghasilkan C7553 di Visual Studio 2017 15.9 dan versi yang lebih baru:

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

Untuk menghindari kesalahan, pindahkan kode rakitan ke fungsi bernama seperti yang ditunjukkan dalam contoh berikut:

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