业务C代码关键审核点总结

2019-10-18  本文已影响0人  打出了枫采

工作有几年了,定位过许多起业务软件运行异常问题,相关问题代码易错点整理如下,示例代码语法上不严谨,供理解参考:
(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)内存和锁的使用应仔细确认;

上一篇 下一篇

猜你喜欢

热点阅读