【发布时间】:2020-06-03 09:19:10
【问题描述】:
当我运行以下程序时,它总是打印“是”。但是,当我将SOME_CONSTANT 更改为-2 时,它总是 打印“否”。这是为什么?我正在使用禁用优化的 Visual Studio 2019 编译器。
#define SOME_CONSTANT -3
void func() {
static int i = 2;
int j = SOME_CONSTANT;
i += j;
}
void main() {
if (((bool(*)())func)()) {
printf("yes\n");
}
else {
printf("no\n");
}
}
编辑:这是func (IDA Pro 7.2) 的输出程序集:
sub rsp, 18h
mov [rsp+18h+var_18], 0FFFFFFFEh
mov eax, [rsp+18h+var_18]
mov ecx, cs:i
add ecx, eax
mov eax, ecx
mov cs:i, eax
add rsp, 18h
retn
这是main的第一部分:
sub rsp, 628h
mov rax, cs:__security_cookie
xor rax, rsp
mov [rsp+628h+var_18], rax
call ?func@@YAXXZ ; func(void)
test eax, eax
jz short loc_1400012B0
这里是主要的反编译:
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // eax
func();
if ( v3 )
printf("yes\n");
else
printf("no\n");
return 0;
}
【问题讨论】:
-
简答:未定义的行为。更长的答案:Undefined, unspecified and implementation-defined behavior.
-
未定义的行为是未定义的。该程序还不如擦除您的硬盘驱动器
-
@super 没关系。如果它调用未定义的行为 - 任何事情都可能发生。
-
这个 c++ 代码没有多大意义。您需要查看程序集以了解发生了什么
-
个人推测 UB 可能很有趣,但它不适合 SO。检查程序集以了解您的编译器做了什么,并检查其源代码以了解它为什么会这样做。此外,
main()返回int。
标签: c++ assembly visual-c++ x86-64 undefined-behavior