您当前的位置:首页 > 计算机 > 编程开发 > C语言

非计算机专业C语言初学者编程规范(学生用)―质量保证

时间:12-30来源:作者:点击数:

(1)代码质量保证优先原则:

①正确性,指程序要实现设计要求的功能。

②稳定性、安全性,指程序稳定、可靠、安全。

③可测试性,指程序要具有良好的可测试性。

④规范/可读性,指程序书写风格、命名规则等要符合规范。

⑤全局效率,指软件系统的整体效率。

⑥局部效率,指某个模块/子模块/函数的本身效率。

⑦个人表达方式/个人方便性,指个人编程习惯。

(2)过程/ 函数中分配的内存,在过程/ 函数退出之前要释放,过程/ 函数中申请的(为打开文件而使用的)文件句柄,在过程/ 函数退出之前要关闭。

分配的内存不释放以及文件句柄不关闭,是较常见的错误,而且稍不注意就有可能发生。这类错误往往会引起很严重后果,且难以定位。

示例:下函数在退出之前,没有把分配的内存释放。

typedef unsigned char BYTE;

int example_fun( BYTE gt_len, BYTE *gt_code )
{
BYTE *gt_buf;

gt_buf = (BYTE *) malloc (MAX_GT_LENGTH);
...  //program code, include check gt_buf if or not NULL.

/* global title length error */
if (gt_len > MAX_GT_LENGTH)
{
  return GT_LENGTH_ERROR; // 忘了释放gt_buf
}
...  // other program code
free( gt_buf  );
}

(3)防止内存操作越界。

内存操作主要是指对数组、指针、内存地址等的操作。内存操作越界是软件系统主要错误之一,后果往往非常严重,所以当我们进行这些操作时一定要仔细小心。

(4)编程时,要防止差1 错误。

此类错误一般是由于把“<=”误写成“<”或“>=”误写成“>”等造成的,由此引起的后果,很多情况下是很严重的,所以编程时,一定要在这些地方小心。当编完程序后,应对这些操作符进行彻底检查。

(5)要时刻注意易混淆的操作符。

当编完程序后,应从头至尾检查一遍这些操作符,以防止拼写错误。形式相近的操作符最容易引起误用,如C/C++中的“=”与“==”、“|”与“||”、“&”与“&&”等,若拼写错了,编译器不一定能够检查出来。

(6)有可能的话,if 语句尽量加上else 分支,对没有else 分支的语句要小心对待;switch 语句必须有default 分支。

(7)不要滥用goto 语句。

goto语句会破坏程序的结构性,所以除非确实需要,最好不使用goto语句。

(8)sizeof操作符不能用在包含边界作用(side effect)的表达式上。

例:
Int32_t = i;
Int32_t = j;
j = sizeof(i = 1234);

表达式i = 1234并没有执行,只是得到表达式类型int的size。

(9)逻辑操作符&&或者||右边不能包含边界作用(side effect)。

例:
if (ishight) && (x == i++))

如果ishight=0那么i++不会被执行。

(10)++和--不能和其他表达式用在一个表达式中。

(11)赋值语句不能用在一个产生布尔值的表达式中。

例:
if ((x = y) != 0)…
更差的用法:
if (x = y)…

(12)浮点表达式不应该测试其是否相等或者不相等,for控制表达式中不要包含任何浮点类型。

(13)数字变量作为for循环的循环计数不要在循环体内部被修改。

例:
flag=1;
for (i=0;(i<5)&&(flag==1);i++)
{
flag=0;
i=i+3;
}

(14)non-void类型函数的所有出口路径都应该有一个明确的return语句表达式。

(15)不要用2级以上指针。

(16)不要轻易使用用Union。

确需使用Union时,一定要注意和清楚在联合体的存储方式(如位填充、对齐方式、位顺序等)上,所使用编译器的处理方法。

(17)标准库中的保留标识符,宏和函数不能定义、重定义和undefined。

(18)时刻注意表达式是否会上溢、下溢。

示例:如下程序将造成变量下溢。
unsigned char size ;
while (size-- >= 0) // 将出现下溢
{
... // program code
}
当size等于0时,再减1不会小于0,而是0xFF,故程序是一个死循环。应如下修改。
char size; // 从unsigned char 改为char
while (size-- >= 0)
{
... // program code
}

(19)使用变量时要注意其边界值的情况。

示例:如C语言中字符型变量,有效值范围为-128到127。故以下表达式的计算存在一定风险。
char chr = 127;
int sum = 200;
chr += 1; // 127为chr的边界值,再加1将使chr上溢到-128,而不是128。
sum += chr; // 故sum的结果不是328,而是72。
若chr与sum为同一种类型,或表达式按如下方式书写,可能会好些。
sum = sum + chr + 1;

(20)系统应具有一定的容错能力,对一些错误事件(如用户误操作等)能进行自动补救。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门