ラムダではインライン アセンブラーはサポートされていません
解説
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());
}