未初始化的布尔变量不一致

时间:2012-03-29 05:40:32

标签: c++ memory boolean initialization

  

可能重复:
  Why do I see strange values when I print uninitialized variables?
  Fun with uninitialized variables and compiler (GCC)

我想知道在解决代码问题时遇到的一个神秘问题。

生产中存在的代码具有未初始化的布尔变量,并且库正在检查此布尔值。 在LIVE站点中,此变量始终表现为TRUE 开发环境中的相同代码始终表现为FALSE。

我知道,由于LIVE& amp;和DEV,未初始化的bool变量可能具有未定义的值。

但这是我的问题。

如果我在代码中放入一个日志语句,编译它并将二进制文件放在开发环境中,bool变量总是为TRUE,而对于LIVE中的代码则为FALSE。

日志语句如何影响未初始化的bool变量的值? 我想知道可能性。

2 个答案:

答案 0 :(得分:14)

一个未初始化的变量只是一块原始内存,并且会显示任何发生的值。你认为“在实时系统中它总是恰好是真的”是完全错误的。所有你可以说的是,每次你在实时系统中观察它似乎都是真的。可能会在下周二发生错误,因为众所周知,未初始化的bool讨厌星期二。

注意,甚至完全有可能未初始化的布尔值对于一个函数看起来是真的而对另一个函数看起来是假的(通常为bool分配一个完整的字节,但是只需要一点来表示该值:它可能是未初始化的bool将包含一个神奇的模糊bool值,这对某人来说是真的,对其他人来说是假的。)

关于标准说什么访问未初始化的变量以进行读取可能确实是未定义的行为,对可能发生的事情没有限制,包括崩溃(例如,在读取未初始化的变量时很容易让程序“停止”,只需使用特定工具进行编译即可跟踪此类问题。在访问未初始化的变量时遇到程序崩溃总是很棒,但不幸的是,它在当前的CPU上相当昂贵,除非使用特定的工具,否则它不会发生。

当然,即使只是printf调用,也可以更改处理未初始化变量的代码的明显行为。这种错误通常被称为"heisenbug",实际上随机或heisenbug行为通常表示未初始化的变量或线程同步问题。

答案 1 :(得分:2)

你说:

  

未初始化的bool变量可能具有未定义的值。

实际上,应该是:“未初始化的bool变量始终具有未定义的值。”

仅仅因为你的价值在变化并没有改变它未定义的事实。行为的唯一保证是规范定义的内容。只要它没有使用静态存储定义定义,行为就是:undefined。编译器可以自由地使用这个变量做任何事情 - 它可以初始化它,它可能不会,如果它没有被记录(即:使用)等,它可以完全优化它。

基本上,你需要正确初始化你的bool,你不用担心它。