当前位置: 首页 > web >正文

代码静态检查

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




http://www.xdnf.cn/news/11239.html

相关文章:

  • 扒一扒随机数(Random Number)的诞生历史
  • 时间序列之协整检验(3)
  • 常见视频接口(HDMI/VGA/SDI/CmaeraLink)介绍
  • 兔子跳铃铛(记原来写的一个游戏)
  • 谷歌三大核心技术(一)Google File System中文版
  • Sqlite3 for Linux 可视化工具 - [Android]
  • android process停止,出现android.process.acore已停止怎么办?解决方法
  • GIS开发到底能应用在哪些行业 ?
  • np的一些函数用法
  • 软件开发管理规范(制度)
  • 电商新趋势来临!?解析Dtop 环球嘉年华电商是否值得加入!
  • 懒人网址导航源码v3.9源码及教程
  • SSM-OA自动化办公系统wljr4(程序+源码+数据库+调试部署+开发环境)
  • 指针与引用
  • superior哥AI系列第6期:Transformer注意力机制:AI界的“注意力革命“
  • 百度网盘国际版 Dubox 体验:干净好用,却与国内用户无缘
  • ubuntu安装rabbitvcs
  • 如何快速的学习单片机,学习单片机的路线是怎样的??末尾附赠教程+项目资料包
  • 软件研发管理经验总结 - 技术管理
  • IIS 服务器,下载APK 文件,用于发布更新最新的APK包
  • layui框架——弹出层layer
  • JavaScriptAPI编程_History对象(获取浏览历史)
  • 插件与控件的区别
  • Linux多线程(2)-线程间同步的5种方式,一次性说清楚!
  • VMware虚拟机Windows 10安装使用教程(非常详细)从零基础入门到精通,看完这一篇就够了
  • 【Maven入门篇】(3)依赖配置,依赖传递,依赖范围,生命周期
  • 软件版本号扫盲——Beta RC Preview release等
  • latex如何输入正确的 双引号
  • WinForm中常用控件
  • C#中CheckListBox的用法