我有一个有缺陷的程序,它将一个变量推送到堆栈上,并且可能在未初始化的情况下使用它。
我使用相同的二进制文件在不同的 Linux 机器上运行。这些机器有不同的 CPU(i5、i7),但除此之外,它们运行的是相同的 Fedora 发行版。
在一个盒子里,我可以轻松发现问题,因为变量有随机数据。
然而,在另一个盒子里,堆栈变量总是被初始化为0(即使它们不应该这样)。
我正在尝试找出这种不同行为的原因。我应该查看哪里?什么可能导致这种情况?是否有任何内核功能会影响此情况?
答案1
没有“应该”或“不应该”未初始化的数据。它可以是任何它喜欢的东西。全零是可能的 - 全一也是可能的,随机垃圾也是可能的。事实上,全零是完全可以接受的随机垃圾形式之一。您无需关心不同盒子上的未初始化数据,只需初始化它,然后然后(只有这样)你才能知道它“应该是什么”。
答案2
在 C 语言中,变量的初始化取决于程序编译时的优化级别。
优化级别 3 不会初始化堆栈中的任何变量。
gcc -O3 program.c -o program