不合格程序
- 错误的浮点数比较用法。
- 指针退化仍使用 sizeof。
- 数组越界操作。
==
写成=
或!=
写成=
。- 宏函数没有足够的括号来预防边界(表达式参数)。
小屁孩程序(需要为其擦屁股,不可用代码)
- 声明变量没有赋初值。
- 函数参数使用前没有判断特殊情况。
- 编写函数在需要返回不同的错误情况时没有返回错误(或者全部使用 -1 表示)。
- 函数调用没有错误返回的判断。
- 理解不完全的错误返回判断(想当然地自己定义错误消息) - 不懂得使用
perror
。 - 重复使用的字符串数组没有
memset
。 - 文件描述符泄漏。
- 使用了内含
malloc
(calloc
) 的 API,没有调用相应 API 释放。 - 循环语句边界条件错误。
- switch-case 没有 break;确定不用 break 的位置需加
/* FALL THROUGH */
注释。 fclose(野指针);
、fclose(NULL);
;free(野指针);
、free(NULL);
发生的情况没有考虑(释放资源后没有对变量“重置”)。- 想当然地使用自我命名地缩写 - 无通用缩写单词使用全单词,或者保留发音字符后长度需大于原本 50%。
- 不适宜的代码风格。
- 有限定范围值的参数,没有对其做判断。
代码风格,错误预防
- 在 if 语句成立情况下必定会执行
break
,continue
,exit
,return
,goto
的代码中勿用if ... else ...
(无需else
)。 - 变量在使用的位置声明与赋值,勿全部集中在函数起始部分。
- 长上下文变量命名使用有含义的名称 - 可将可用于该变量注释内容用下划线连接后作为变量名。
- 函数名尽可能提供足够多的信息。
- 不应该惧怕编写函数,而在函数内直接添加 bug fix 代码,直接添加 feature 代码。
- 有必要就、尽可能地使用
enum
定义函数返回。 - 尽可能做显式条件判断(不要使用
if (!<condition>)
这种写法)。 - 多使用
struct
组织变量,为struct
添加void (*to_string)(struct name_s *me, char dst[])
函数,尽可能为struct
编写构造函数。 - 写足够多的代码以形成确定的个人代码风格 - 公司内尽最大可能使用约定风格。
- 必要的注释。
- 不要滥用短路逻辑;
- 不要在判断条件中做
fp = fopen(file, "r")
打开文件并做相关判断。 - 不要在判断条件中做
malloc
并做相关判断。
- 不要在判断条件中做
- 尽可能使用 const, static, extern 限定条件。
- 弱类型语言 - 不要隐式变量类型转换;尽可能显式类型转换,对于无法做到显式的位置要做注释。
bug 实例收集 - N/A
for 循环 - N/A
声明变量没有赋初值
声明变量没有赋初值有多糟糕?下面是一个典型的代码:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
typedef enum {
FALSE=0, TRUE} Boolean;
void print_date();
void get_date(char *);
Boolean chr2bool(char c)