代码静态检查

1、静态检查介绍

       代码检查可以有效的提高代码质量,更进一步的说代码检查不仅仅是为了提高代码质量,已深入到代码程序的逻辑检查、内存使用情况的检查甚至更高层面的检查,很大程度上影响了程序的功能和性能。

       代码检查分为:

       动态检查:程序运行时检查,侧重于内存和资源使用情况检查;

       静态检查:指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。

       代码静态检查带来的好处:

      1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷;

      2. 帮助代码设计人员更专注于分析和解决代码设计缺陷;

      3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。

      静态检查可以检测的问题有:

      变量未初始化;

      空指针引用(野指针);

      数据类型不匹配;

      返回局部变量;

      数组越界;

      内存泄漏;

      ……;

       如下实例,通过静态检查工具可以检查的错误信息(这些问题在代码编译的时候可能不会出现)。


  
    
    
    
    
#include
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张图片
 图 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的标志。




你可能感兴趣的:(其他)