コンパイラの警告 (レベル 1) C4731
'pointer': インライン アセンブリ コードによって変更されたフレーム ポインター レジスタ 'register' です
フレーム ポインター レジスタが変更されました。 インライン アセンブリ ブロック内のレジスタまたはフレーム変数 (変更されたレジスタに応じてローカルまたはパラメーター) を保存して復元する必要があります。そうしないと、コードが適切に動作しない可能性があります。
次の例では C4731 が生成されます。
// C4731.cpp
// compile with: /W1 /LD
// processor: x86
// C4731 expected
void bad(int p) {
__asm
{
mov ebp, 1
}
if (p == 1)
{
// ...
}
}
EBP はフレーム ポインターであり (FPO は許可されません)、変更されています。 p
は後で参照されるとき、EBP
を基準として参照されます。 しかし、EBP
はコードによって上書きされているため、プログラムが適切に動作しません。フォールトが発生する場合もあります。