コンパイラ エラー C7553

ラムダではインライン アセンブラーはサポートされていません

解説

Visual Studio 2017 バージョン 15.9 より前のバージョンの Visual Studio では、ラムダ内でインライン アセンブラーを使用すると、実行時に (リターン アドレス レジスタ) が破損 ebp する可能性があります。 悪意のある攻撃者は、このシナリオを活用できる可能性があります。 インライン アセンブラーは x86 でのみサポートされており、インライン アセンブラーとコンパイラのその他の部分との間の相互作用は貧弱でした。 これらの事実と問題の性質を考えると、この問題の最も安全な解決策は、ラムダ式内のインライン アセンブラーを許可しないことでした。

ラムダ式内でのインライン アセンブラーの唯一の使い方として出回っていたのは、リターン アドレスをキャプチャすることを目的としたものでした。 このシナリオでは、コンパイラ固有の _ReturnAddress() を使用し、すべてのプラットフォームでリターン アドレスをキャプチャできます。

コンパイラ エラー C7553 は、Visual Studio 2017 バージョン 15.9 以降の Visual Studio で発生します。

次のコードでは、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());
}