编译器警告(等级 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
已被代码覆盖,因此程序将无法正常工作,甚至可能出错。