Derleyici Hatası C7553
satır içi assembler bir lambda'da desteklenmiyor
Açıklamalar
Visual Studio'nun Visual Studio 2017 sürüm 15.9'un önceki sürümlerinde, bir lambda içinde satır içi assembler kullanımı çalışma zamanında bozulmaya ebp
(dönüş adresi kaydı) yol açabilir. Kötü amaçlı bir saldırgan bu senaryodan yararlanabilir. Satır içi derleyici yalnızca x86'da desteklenir ve satır içi derleyici ile derleyicinin geri kalanı arasındaki etkileşim zayıftır. Bu olgular ve sorunun doğası göz önünde bulundurulduğunda, bu sorunun en güvenli çözümü bir lambda ifadesi içinde satır içi derleyiciye izin vermekti.
'Vahşi doğada' bulduğumuz bir lambda ifadesi içinde satır içi assembler'ın tek kullanımı dönüş adresini yakalamaktı. Bu senaryoda, yalnızca bir derleyici iç kullanarak tüm platformlarda _ReturnAddress()
dönüş adresini yakalayabilirsiniz.
Derleyici Hatası C7553, Visual Studio 2017 sürüm 15.9'dan başlayarak Visual Studio'da oluşur.
Örnek
Aşağıdaki kod, Visual Studio 2017 15.9 ve sonraki sürümlerde C7553 üretir:
#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;
}
Hatadan kaçınmak için, derleme kodunu aşağıdaki örnekte gösterildiği gibi adlandırılmış bir işleve taşıyın:
#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());
}
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin