Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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());
}