コンパイラ エラー C7553

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

解説

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

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

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

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