最近排查软件的一个问题,百思不得其解,最后查下来竟然是一个变量没有初始化引起的!
最近在按照新需求,开发新功能,在调试某个功能时,出现一个诡异的现象。在运行通过release安装包安装的exe版本,始终是有问题的,但是直接在VS2017中进行release版本调试,发现功能居然是正常的!
同样都是release版本,底层库都是一样的,两个版本表现居然截然不同,这太奇怪了!百思不得其解!
于是继续排查,想到这个问题在之前稳定版本是没有的,应该是最近开发新功能引起的,于是使用svn查看了最近的代码提交记录,找到相关代码模块仔细排查,结果发现是一个BOOL变量影响了代码的控制逻辑。在程序运行的开始阶段,该变量应该是FALSE的,出问题的版本居然走到该控制变量为TRUE的分支中,导致代码的控制逻辑出了问题,所以导致上述问题!
在变量没有初始化时,很多编译器在debug下会自动初始化,但在release下不会自动初始化。release下变量如果没有初始化,变量的值将会是一个随机值,是给该变量分配的内存时内存中的值,所以会是随机值,一旦出现了随机值,程序运行时会出现不可预知的结果。
本例中,直接运行安装包安装的exe版本与release调试运行,该控制变量会得到随机值,所以导致两种情况下的不同表现!
另外,有点迷惑人的地方是,几乎每次直接运行安装包安装的exe版本时,该BOOL变量的随机值都是TRUE,但在release下调试运行时该变量的值一直是FALSE,这也许和两种情况的启动运行机制差异有关系吧!反正是变量没有初始化引起的!
以前我们在开发团队中一再强调变量要初始化,但还是有人说,变量不需要一上来就初始化,只要控制好自己的代码逻辑就好了,我表示很不赞同!只有经历过问题的人,才会有深刻体会吧!