今天对代码检视有了一点点灵感,写点感想。
之前我对代码检视的认识一直都是停留在很浅的层次,都简单的以为代码检视就是看看代码本身有没有错,有没有把==写成=,<=写成<之类的,总之都是停留在表层上。今天通过勇哥的指导,手把手带着检视了几个函数功能块后,有了那么一点点深层次的认识:
- 代码检视最难检测出来的问题是逻辑方面的问题,要检查出逻辑上的问题,就必须要对系统框架很了解;只有了解了系统框架或者功能,你才知道功能的实现是否正确,是否实现完全。
- 检视过程中,遇到不明白的地方,要及时和开发的人沟通,一来可以趁机了解系统功能,二来可以验证代码实现是否正确。
- 如果是新代码,可能在表层上会出现错误,比如内存申请了最后没释放,for循环里面判断值边界错误导致溢出等等。这些都是可以不用了解系统功能就能看出来的错误,适用于刚写好的代码,不适用于老代码。
- 底层代码,函数入参检查这一块,很容易误判。底层接口,入参可以由调用函数来保证合法;在检视的过程中,需要关注上层调用函数,大多数时候,都会保障入参的正确性。不要轻易下结论。
- 代码检视的九句箴言使用于初级阶段的检视,也就是检查代码本身有没有问题。用在这种场合,还是很精辟的,附上九句箴言:
- 看到if,就想else。这句主要是用来判断,有没有进行异常分支等处理;关键还是看需求,很多时候也是不需要else的。
- 看到malloc就去找free。这个要留意的地方是,有可能free不是直接调用的,而是通过调用其他函数,在别的函数体内实现,要找仔细。
- 函数调用要小心,需要看看返回值。这句一直没有实际应用过,看了很多代码,都没这个问题,可能是开发的兄弟检查过了。
- 看见for循环,就要找边界值。这个应该比较常用。
- 看见return要注意,要去前面找资源。就是return前,要把申请的资源给释放了。
- 看见数组把神提,问题往往在下标。看看有没有越界溢出。
- 不要小看字符串,长度是个大问题。也是看看有没有溢出。
- 得到函数不着急,看看变量初始化,各种路径要小心。在拿到函数之后,要习惯性的看看所有的局部变量是在函数一开始就被初始化了如果有变量没有被初始化,就要小心了。如果发现变量是在if,for,while,等语句中被初始化的,问题可能就来了。
- 赋值函数最危险,变量没有初始化。主要是针对指针使用前是否初始化。