结合以前工作经验,整理的编码常见的错误、推荐风格,及原因:
编程常见错误TOP10:
-
返回值使用错误
-
调用函数的执行结果对流程有影响,却未判断返回值的
-
返回值使用不准确
-
返回值的宏和判断的宏不是同一套
-
错误的类型转换,返回值类型和赋值变量类型不一致
-
-
-
断言的使用
-
在可能出现的位置使用断言
-
-
系统资源使用
-
资源的申请和释放不在同一层次。
-
资源的malloc和free要在同一个if/while/for的层次内,这样逻辑清晰,走查的时候好判断是否有释放。也不容易遗漏。
-
-
成对的系统资源操作之间异常退出。成对的malloc/free spin_lock/spin_unlock fopen/fclose之间,不允许有return操作。成对的资源申请、释放之间如果有return语句,需要在return之前释放资源,如果有多个资源、多个return的组合,需要考虑每个return时需要释放的资源,复杂度很高、维护难度大。因此,不建议使用return,可以用ulRet记录返回状态,只有在操作成功时才进行后续操作,在程序结尾同一进行return
-
过早进行资源申请导致不必要的回退或资源泄露。如果需要入口条件满足才进行后续处理,应该先判断入口条件再进行资源申请。
-
资源直接赋值给间接变量。间接变量包括:结构体字段,多级指针,全局变量。资源malloc等,要避免直接赋值给间接变量。原因包括:1、pclint等代码检查工具无法追踪间接变量,直接赋值会导致工具无法检测到资源泄露等问题。2、全局变量等可能有并发使用,直接赋值可能存在赋值和初始化之间被调度时,访问未初始化的资源
-
-
内存释放
-
错误的函数释放
-
内存释放函数和申请函数要配套,自定义的结构如果有封装申请函数要使用对应的释放函数释放所有资源。
-
-
释放非法地址、重复释放、释放后再使用内存
-
释放内存前未从结构上摘除
-
内存泄露、未第一时间释放资源
-
-
内存越界
-
字符串、内存拷贝、清零操作越界
-
缓冲区太小越界
-
非法参数未检查导致越界
-
-
空野指针
-
释放全局变量资源后未清零变量
-
释放结构体挂接的内存后,未清零字段
-
访问空指针
-
-
未初始化
-
变量未初始化
-
数据结构字段未初始化
-
动态内存未初始化
理论上所有的变量内存数据结构都需要进行初始化,初始化值一般是0,如果初始化值非0在memset后需要手动赋值初始化值
-
-
代码冗余
-
类似的大段代码,如果有逻辑功能相同的大段代码,需要封装成函数,而不是ctrl c复制修改,大量重复代码导致这段逻辑修改时,需要修改大量的地方,工作量大且容易出错,维护成本高
-
反复多重间接寻址。特别是在循环操作中有大量-> . 等间接寻址的操作,会较大的影响性能,建议使用局部变量保存寻址后的值,在循环中直接使用。
-
为处理不可能事件引入虚假分支。
-
无必要的内存拷贝
-
无必要的申请静态、动态内存
-
临时使用小内存时,申请动态内存。一般小内存的概念是小于256byte的内存。
-
-
编程接口
-
模块或驱动接口使用错误
-
-
资源型接口设计
-
释放参数携带的资源时规则不一致,要么内部释放要么外部释放,不能有同时存在的情况,否则容易使用出错
-
复合资源申请释放未封装或封装不对称。如果一个结构体内包含其他内存申请等资源组合成复合资源,需要封装对应的申请、释放函数,统一申请、释放全部资源。后续对该资源的申请释放通过封装的接口来操作。
-
资源创建、获取函数未将资源作为返回值而是参数。资源创建的函数理论上和malloc等类似,建议申请成功返回资源,申请失败返回NULL。不建议将资源通过指针返回。
-