内容检查
if (a == b)
是否有写成if (a = b)
的,同时可以通过把常量写在左边,变量写在右边来进行预防- printf输出参数的个数、格式、内容是否匹配
- 只在源文件内部使用的函数、变量等是否加了static进行限定
- 对于BOOL型的变量判0只能使用
if (flag)
或者if (!flag)
而不能使用if (flag == TRUE)
或if (flag != TRUE)
- 对于非BOOL型变量判0则正好相反,逻辑表达需要明确给出,数值判断必须使用定义的宏,只能使用例如
if (x != LACP_EMPTY)
不能使用if (!x)
,相应的对于布尔型就只能使用如if (flag)
,不同再进行判断 - 如果为提供给外部调用的接口函数,是否对入参进行各种合法性的细致检查
- 信号量操作地方严格检查,防止死锁,需要跳出的地方需要使用goto而不能直接return
- 每个switch的case后面是否都加了break,包括default后面
-
内存检查
malloc申请内存后是否判申请失败
- malloc申请内存成功后是否进行初始化
- free(p)后是否使用
p = NULL
将指针赋空 - free(p)前是否判断
p == NULL
防止释放空指针 - 数组、内存使用前是否进行初始化(统一在使用前进行初始化,定义前可不初始化)
-
格式检查
指针前是否加p前缀进行标识
- 结构体、枚举格式是否统一,容易识别,如定义别名,然后结构体后面统一加
_s
,枚举后面加_e
- if、for、do后面是否带了空格
- 是否使用“半开半闭”区间进行条件判断 例:
for (i = 0; i <= 9; i++)
应改为for (i = 0; i < 10; i++)
- 每个switch的case后面是否都加了break,包括default后面。
- 是否使用默认优先级 例:
if (a > b && c < d)
应改为if ((a > b) && (c < d))
也即能用括号括起的地方都进行括起 - 常量数值是否使用宏进行替代
define中的是否加括号进行限定 例:
#define a b
应改为#define a (b)
- 不带参数的函数是否申明为了具有VOID类型的参数,也即
INT32 a(VOID)
; - 函数参数中只用于传参的指针前面是否加了const进行限定