編譯器錯誤 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());
}
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應