1、静态检查介绍
代码检查可以有效的提高代码质量,更进一步的说代码检查不仅仅是为了提高代码质量,已深入到代码程序的逻辑检查、内存使用情况的检查甚至更高层面的检查,很大程度上影响了程序的功能和性能。
代码检查分为:
动态检查:程序运行时检查,侧重于内存和资源使用情况检查;
静态检查:指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。
代码静态检查带来的好处:
1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷;
2. 帮助代码设计人员更专注于分析和解决代码设计缺陷;
3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。
静态检查可以检测的问题有:
变量未初始化;
空指针引用(野指针);
数据类型不匹配;
返回局部变量;
数组越界;
内存泄漏;
……;
如下实例,通过静态检查工具可以检查的错误信息(这些问题在代码编译的时候可能不会出现)。
#include <stdio.h>int main (int argc, char **argv)
{
char cBuf[10] = { 0 };
char *pTemp;
int i; for (i = 0; i <= 10; i++) {
cBuf[i] = 0;
} printf("output %s\n", pTemp); return (0);
}
编译后没有出现报错提示,然后运行静态检查,会出现如下图所示报错现象。
图 1 静态检查错误信息
2、常用的静态检查工具
静态检测工具种类很多,下面介绍几种常见的检测工具。
1、cppcheck
Cppcheck是一种C/C++代码缺陷静态检查工具,不同于C/C++编译器及其它分析工具,Cppcheck只检查编译器检查不出来的bug,不检查语法错误,作为编译器的一种补充检查,cppcheck对产品的源代码执行严格的逻辑检查。 执行的检查包括:
1.自动变量检查
2.数组的边界检查
3.class类检查
4.过期的函数,废弃函数调用检查
5.异常内存使用,释放检查
6.内存泄漏检查,主要是通过内存引用指针
7.操作系统资源释放检查,中断,文件描述符等
8.异常STL 函数使用检查
9.代码格式错误,以及性能因素检查
2、pc-lint
PC-Lint是GIMPEL SOFTWARE公司开发的C/C++软件代码静态分析工具,它的全称是PC-Lint/FlexeLint for C/C++,PC-Lint能够在Windows、MS-DOS和OS/2平台上使用,以二进制可执行文件的形式发布,而FlexeLint 运行于其它平台,以源代码的形式发布。PC-lint在全球拥有广泛的客户群,许多大型的软件开发组织都把PC-Lint检查作为代码走查的第一道工序。
PC-Lint不仅能够对程序进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针以及冗余的代码,还能够有效地帮你提出许多程序在空间利用、运行效率上的改进点。
pc-lint提供的检测类型:
1.强类型检查
2.变量值跟踪
3.赋值顺序检查
4.弱定义检查
5.格式检查
7.缩进检查
8.const变量检查
9.volatile变量检查
3、splint
针对C语言的开源程序静态分析工具splint(原来的 LCLint), 是一个GNU免费授权的 Lint程序,是一个动态检查C语言程序安全弱点和编写错误的程序。Splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误。
splint提供的检测类型有:
1.解引用空指针(Null Dereferences)
解引用空指针将导致我们在程序运行时产生段错误(Segmentation fault)。
2.类型(Types)
我们在编程中经常用到强制类型转换,将有符号值转换为无符号值、大范围类型值赋值给小范围类型,程序运行的结果会出无我们的预料
3.内存管理(Memory Management)
C语言程序中,将近半数的bug归功于内存管理问题,关乎内存的bug难以发现并且会给程序带来致命的破坏。
4.缓存边界(Buffer Sizes)
splint会对数组边界、字符串边界作检测,使用时需要加上+bounds的标志。
————————————————