新闻  |   论坛  |   博客  |   在线研讨会
静态检查介绍
电子禅石 | 2020-04-17 13:00:04    阅读:13219   发布文章

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的标志。
————————————————

原文链接:https://blog.csdn.net/mr_wangning/article/details/73381198


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
属于自己的技术积累分享,成为嵌入式系统研发高手。
推荐文章
最近访客