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

Inconsistency in uninitialized boolean variable

本文关键字:变量 不一致 布尔 初始化      更新时间:2023-10-16

可能重复:
为什么在打印未初始化的变量时会看到奇怪的值
有趣的未初始化变量和编译器(GCC)

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

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

我知道,由于LIVE&DEV,一个未初始化的布尔变量可以有一个未定义的值。

但这是我的问题。

如果我在代码中放入一条日志语句,对其进行编译,并将二进制文件放入开发环境中,那么bool变量始终为TRUE,而在LIVE中的代码为FALSE。

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

未初始化的变量只是一块原始内存,无论发生什么情况,都会显示为值。你认为"在现实生活中,它总是碰巧是真的"是完全错误的。你只能说每次你在实时系统中观察到它时,它似乎都是真的。也许是在下周二,但这将是错误的,因为众所周知,未初始化的bools讨厌周二。

请注意,一个未初始化的布尔值对于一个函数来说可能是真的,而对于另一个函数则可能是假的(通常为布尔值分配一个完整的字节,但只需要一点就可以表示该值:一个未启动的布尔值可能会包含一个神奇的模糊布尔值,它对某人来说是真,对其他人来说是假)。

至于标准中所说的访问未初始化变量进行读取可能确实是未定义的行为,对可能发生的事情没有限制,包括崩溃(例如,在读取未初始化变量时很容易让程序"停止",只需使用特定的工具来跟踪这类问题即可)。总是在访问未初始化的变量时发生程序崩溃是很好的,但不幸的是,在当前的CPU上,这相当昂贵,除非使用特定的工具,否则不会发生这种情况。

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

您声明:

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

事实上,应该是:"一个未初始化的bool变量总是有一个未定义的值。"

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

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