【发布时间】:2020-01-10 14:01:55
【问题描述】:
可执行代码的地址是在链接时决定的,不是吗?
#include <stdio.h>
int main ()
{
printf("%p", (void*)&main);
return 0;
}
示例输出 #1:
0x563ac3667139
示例输出 #2:
0x55e3903a9139
【问题讨论】:
-
ASLR.
-
严格来说,代码会引发 UB,因为
p转换说明符仅用于void指针(至少在 C 中)。所以任何数字都可能被打印出来。 -
@alk 您当然可以在
printf()中对 (void *) 执行显式强制转换,然后它就不再是 UB。但仍有可能打印出任何数字……现在,这是什么意思? -
@Ctx:仍然是 C++ 中的 UB。取不到
main的地址。 -
@LightnessRacesBY-SA3.0 在 C++ 中这是无可争辩的,正确的