最近调试C语言程序,出了一些错误,费了很大的力气才找到这些BUG。现在把这些错误记录下来,同时做一些编程上的原则上的约束,希望能达到两个目的:(1)看到类似的情况,能马上定位知道是什么错误。(2)不在犯这种错误。
将64位整型转换为32位整型,貌似是没什么问题。但是在做多结点间数据通信的时候,这个不注意的细节将导致很严重的错误。例如在发送端使用的是64位的整型,接收端使用32位整型,这样会导致接收端由于接收缓冲区中的数据没有完全被反序列化阻塞。
还有使用无符号数的时候一定要注意,因为无符号数减去一个比自身还要大的数,容易出现很严重的问题。原理大家都知道,内部是使用补码存的,但是写程序的时候不一定能注意到。
使用一些底层的库函数时一定要确保传入的数据类型与接口要求的数据类型一致。我就发生过因为使用zlib的compress函数时要求传入unsigned char * 和 unsigned long int *时,我使用了char *和 unsigned int *时出现一些莫名其妙的错误。
在使用没有接触的技术或者是底层的库函数的时候,一定要写够测试程序,充分的熟悉接口的使用,而不应该直接集成在软件中,否则会出现很严重的问题。
使用系统调用或者库函数或者第三方软件的函数时,如果有返回值,一定要检查返回值的情况,以判断程序是否正确。可能就是这样一个小小的问题就会导致×××打偏或者卫星脱轨,或者是火车站售票系统上常显示的”XXXX位置的内存不能为读“之类的致命错误。如果函数可能会抛出异常,一定要捕获异常。在调试阶段,出现这样问题时,一定要使用exit或者abort之类的方法,强制程序在此结束,并打出当前的行号、文件名称,如果有必要的话还有堆栈信息等这些重要的调试信息。这些对于确定程序出错的位置非常有帮助。
养成读文档的好习惯,出现问题的很多一部分原因都是没有仔细阅读文档。文档中详细的说明了接口的使用和注意事项,没有注意到这些细节,调试简直就是自作自受。
还有常做单元测试,确保缩写的部分代码能够正常运行。然后再集成到软件中,否则出现问题的付出的代价要大的多。
转载于:https://blog.51cto.com/hipercomer/861856