編譯程序錯誤 C7553
在 lambda 中不支援內嵌組譯工具
備註
在 Visual Studio 2017 15.9 版之前的 Visual Studio 版本中,在 Lambda 中使用內嵌組譯工具可能會導致運行時間損毀 ebp
(傳回位址緩存器)。 惡意攻擊者可能利用這種情況。 只有在 x86 上才支援內嵌組合語言,且內嵌組合語言與編譯器其餘部分之間的互動性很差。 鑒於這些事實和問題的性質,此問題最安全的解決方案是不允許在 Lambda 運算式內使用內嵌組合語言。
我們所見唯一會在 Lambda 運算式內使用內嵌組譯工具的實際情況,是擷取傳回位址。 在此案例中,您可以擷取所有平台的寄件地址,只要使用編譯器內建 _ReturnAddress()
即可。
從 Visual Studio 2017 15.9 版開始,Visual Studio 中會發生編譯程式錯誤 C7553。
範例
下列程序代碼會在 Visual Studio 2017 15.9 和更新版本中產生 C7553:
#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());
}