編譯器錯誤 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());
}