我注意到我的 C 编译器 (gcc) 可以让我执行以下操作:
#include <stdio.h>
main(){
short m[32768];
short y = -1;
short z = -1;
printf("%u\n", y);
m[y] = 12;
printf("%d\n%d\n", y, m[z]);
}
当我运行它时,它会吐出:
4294967295
12
12
这对我来说似乎有点莫名其妙。
首先,运行这样的程序对我来说安全吗?我是否有可能意外覆盖操作系统(如果相关,我正在运行 OS X)?
此外,我曾预料到至少会出现像我过去遇到的某种段错误,但悄悄地忽略这样的错误真的让我害怕。为什么这个程序不对我造成段错误?
最后,出于好奇(这可能是最愚蠢的问题),有没有办法解决这种疯狂?我可以期望所有 ANSI C 编译器都以这种方式工作吗?不同平台上的 gcc 怎么样?内存布局是否明确定义为可利用(也许如果您要编写跨平台的混淆代码)?