工作几年了,算不上码农,总是在解bug,谈谈经常遇到的问题
1) 数据类型混用。 这个问题由来已久,大家可能都知道,但是实际工作中不注意,经常转换出错,最多的是int 被转换成unsigned int或者unsigned 变换成int, 造成的错误很难检查出来,编译时最多是个警告,很多编译器警告也没有。最基本的东西往往需要牢记,并且多看看些历史的失败经验教训,那样才会有深刻的体会!
2)返回值检查不充分。 返回值有很多种可能,很少人会每个都处理,基本就是两个:成功或者不成功,甚至很多时候连返回值都不判断,直接调用,理所当然认为不会失败,结果问题会很绕,往往出错的地方离触发点很远,调试很辛苦啊!另外C++中还有个讨厌的异常处理,很多人不关心,有些则因为编译器的问题对异常类(模板)的继承与重载处理不好,出了问题都让人抓狂。
3)边界条件处理不当。 这个最难处理,因为很多时候设计者为了简单,往往不会考虑太多,程序运行的结果像是飞船进入了异度时空,而且很多时候往往很久才能发现,最重要问题还不是这个,相比较前两个这个最难的是修改,因为原来设计者都没有考虑,你必须完全理解原始设计者的思想才能比较好地解决。最简单的例子就是 for循环(i=0; i <=100; i++)中的 i < 100 还是 i <= 100, 如果没有注释鬼才知道他要100次还是101次呢。
基本上通用的就三点,另外我做嵌入式,有些特殊的方面要特别注意
1)效率,嵌入式程序的CPU占用率不能太高,否则系统随时崩溃,所以在大数据量的循环嵌套,查找替换等等需要好的算法,另外很多时候一个简单的语句如果被重复调用很多次,那么这个简单语句就不能简简单单的了!很多时候需要实际测试来决定。
2)内存,能少用就少用,很多时候内存耗费在你根本想不到的地方,有时开个大块内存(4k)就失败,所以内存泄漏是非常严重的问题,毕竟嵌入式系统的内存太少了。。。另外栈的使用也要注意,很多函数形参最好能用引用就用引用,不能用引用用指针,否则堆栈很快满了,运行效率大大地低啊! |