程序初始化失败解决方法 应用程序初始化失败怎么办( 二 )


然后以 m_CallBackFunc 内存中的非有效值作为代码段函数地址,直接 call 过去,这是非法的函数调用跳转,即我们经常说的代码“跑飞了”!跳转到的代码处的内存没有准备好,这种非法跳转基本都会发指内存访问违例导致软件崩溃!从现象上看,代码崩溃在一个逻辑上讲不通的地方,甚至是和当前代码的上下文完全没有关系的地方!
后来查下来发现是 m_CallBackFunc 没有初始化引起的,应该初始化为 NULL,代码跑飞了,程序运行过程中出现了不可预料的结果,代码可能就会出现胡乱崩溃的问题了,比如本例中崩溃:

程序初始化失败解决方法 应用程序初始化失败怎么办


这个未初始化的问题,比上面讲的第一个问题还要严重,直接导致了崩溃 。
本例中有两个地方是有问题的,一是在调用 dll 其他接口之前,应该先调用 SetConfigCallBackFunc 接口将回调函数设置进去;二是保存回调函数地址的成员变量 m_CallBackFunc 要初始化 。
3、代码静态检测工具 PC-Lint 和 TScanCode

程序初始化失败解决方法 应用程序初始化失败怎么办


能否通过一些工具提前分析出软件中存在的潜在问题呢?答案是肯定的!有两个 C/C++静态分析工具比较常用,一个是 GIMPEL SOFTWARE 公司开发的 C/C++软件代码静态分析工具 PC-Lint,一个是腾讯静态分析团队开发的一款开源免费的 C/C++静态分析工具 TScanCode 。
利用这些静态分析工具可以发现代码中很多潜在的错误,比如变量没有初始化,数组越界,空指针等问题 。这些工具使用通用的规则去分析代码中可能存在的缺陷,会出现很多的误判,我们在使用这些工具时要加以甄别!
以前比较抗拒这些静态检测工具,会产生一堆误报,比较烦人,但这些工具确实能帮我们提前发现一些问题 。因为开发团队中成员的水平层次不齐,特别是缺乏经验的新人,难免会出现一些错误或者考虑不周全的地方!
4、总结
以前我们在开发团队中一再强调变量要初始化,但还是有人说,变量并不需要一上来就初始化,只要控制好自己的代码逻辑就好了,我表示很不赞同!你水平比较高,也许可以控制好代码不出问题,但是后续的维护人员能保证不出问题吗?也许只有经历过问题的人,才会有深刻体会吧!

推荐阅读