工作有几年了,定位过许多起业务软件运行异常问题,相关问题代码易错点整理如下,示例代码语法上不严谨,供理解参考:
(1)循环语句,确保一定能够退出,防止出现死循环;
void func(U32 in)
{
U32 i = 0;
for (i=0;i<in;i++) {
// 上限in未做保护,如果是一个减翻的结果,软件运行到这个函数就挂住了
// 代码内部错误的改写了循环变量i或者in的值,导致无法退出
...
}
}
(2)循环语句,退出时,循环体内break 与 return的使用应尽量一致,是否涉及资源释放,正常退出与异常退出前的处理是否准确;
(3)业务模块的内存管理,应由统一的申请释放,尽量减少业务流程细节中的内存操作,避免内存泄漏和异常释放;
void ModuleCtxInit()
{
// mem init
// ctx cfg init
...
}
void ModuleMngProc()
{
// use mem in module ctx
...
}
void ModuleCtxInit()
{
// ctx cfg clear
// mem free
...
}
(4)U8 数据易出现加翻风险,U32数据易出现减翻风险,使用时需仔细确认所用变量取值范围;
U8 a = 180;
U8 b = 100;
U8 c = a + b; // error c != 280 c = 24
U32 a = 10;
U32 b = 100;
U32 c = a - b; // error unsigned value ( -90 ) equals to max int minus 90
(5)内存拷贝与初始化,应防止出现内存越界操作;
memcpy(void * dst, void * src, int memLen) // 入参lenth 对于源地址和目的地址是否会有越界问题
memset(void * startAddr, int val, int memLen) // 同样
(6)数组下标,地址偏移,上限保护,防止越界操作;
(7)空指针校验,除零保护,内存释放时,指针置空,防止出现野指针;
(8)内存和锁的使用应仔细确认;
网友评论