我们有一个C ++代码体,它从基于RHEL4的发行版移植到基于RHEL-5的版本。 它曾经用g ++ 3.4.3编译,现在用g ++ 4.1.2编译。 事实证明,正在使用未初始化的本地POD变量,这是导致的 新环境下的失败 - 这并不奇怪,因为C ++规则说明了本地的POD结构 没有初始化,因此是随机的。
我正在寻找一个解释,为什么在编译3.4.3时这不会打扰我们, 但现在正在对4.1.2造成严重破坏。是否有一个模糊的设置 gcc3的规范有助于初始化本地POD变量吗?
答案 0 :(得分:3)
顾名思义,未定义的行为是未定义的。编译器不必解释为什么他们做他们做的事情,他们不必一致地做一件事,他们不必为他们做的事情有理由。
编译器通常处理未定义行为的方式是忽略它。从来没有一个GCC开发人员坐下来说“让我们写一些关于GCC处理未初始化变量的代码”。无论发生什么事情都会因为GCC中的所有其他代码掉落而发生。因此,新版本的编译器可能会对未初始化的变量执行不同的操作,不是因为编译器以不同方式处理它们,而是因为它从未故意处理它们 at all 。
答案 1 :(得分:1)
也许通过使用g ++的更新版本(例如 4.6.1 )编译代码并询问所有警告(使用 -Wall -Wextra ),然后通过黑客攻击源代码直到不再发出警告,你可以改善这种情况