1.拼写错误
a) 变量名,宏名,函数名等拼写错误,在编译阶段直接报错;
b) 变量名,宏名,函数名等拼写为相近的变量名,宏名,函数名等,在运行时出错;
2.逻辑错误
a) if语句的真值逻辑判断,没有包括全部的条件,或者包含了不需要的条件;
b) 选择计算方式时,采用了错误的计算方法;
3.边界值问题(Off-one)
a) if语句判断的边界值问题;
b) while/for等语句的边界判断问题;
4.调用错误的近似函数
a) 函数名相近的函数,调用错误;(过去一段时间常调用错的memset/memcpy)
5.变量初始化问题
a) 局部变量初始化;
b) 函数入参的初始化;
c) 函数返回值的初始化;
d) 释放内存的初始化;
6.编译时的警告问题
a) 参照以前的常见警告列表;
7.版本管理
a) 很重要,需要做好版本管理;
8.可读性
a) 很重要,减轻以后的维护压力;
相应错误导致程序运行时出现的一些问题:
1.拼写错误;
a) 内存溢出;
b) 出现意外的结果;
2.逻辑错误;
a) 对于特定的值计算出现错误;
b) 对于某些条件,执行出错;
c) 数组越界;
d) 内存溢出;
3.边界值问题
a) 部分可归于逻辑错误;
b) 数组越界;
c) 内存溢出;
d) 循环结束时,出现多操作或者少操作一个元素;
4.调用错误的近似函数
a) 内存溢出;
b) 计算错误;
c) 结果在意料之外;
5.变量初始化问题
a) 大部分时候运行正确,偶尔运行错误;
b) 大部分时候运行错误,偶尔运行正确;
c) 在有些地方运行正确,在其他地方运行失败;(在某些函数之前,之后,之中)
6.编译器警告问题
a) 影响很严重;
b) 影响很小;
c) 没有影响;
找到原因的难易
1.拼写错误
a) 在编译时出现的错误,好找;
b) 在运行时出现的错误,有些好找,有些不好找;
2.逻辑错误
a) 错误没有出现,不好找,需要特定的条件,因为大部分时候运行正确,只有在特定值或者特定条件出现错误;
b) 错误如果出现了,比较好重现,这个时候变得好找;
3.边界值问题
a) 同(2)
4.调用错误的近似函数
a) 一般会导致运行出错,比较好找;
5.变量初始化问题
a) 如果想到了初始化问题,比较好找;
b) 如果没有想到初始化问题,十分难找;(因为现象出现随机,比较灵异。一般如果程序出现了比较灵异的运行现象,需要考虑初始化问题)
7.编译器警告问题
c) 重视警告,分析警告问题。
其他一些错误原因:
1.不同类型指针间的强制类型转换;造成数据截断或者错误
2.不同类型变量间的强制转换;造成数据截断
3.调用一些不安全的函数,如strcat等,没有长度限制的字符操作函数;
暂列如上。