软件工程:代码静态分析工具

什么是静态代码分析工具呢?

用一句最直白的话就是:在代码运行前的一个检查代码规范,错误等的分析并提出建议的工具

这里有这么几个关键词:

 

  • 代码运行前:很明显,这个工具就是对文本代码进行分析的,不用编译等等
  • 检查:它是一个具有一定的分析智能的工具,可以分析出野指针,未达代码等错误的工具,而不是一个简简单单的类似于在一个IDE里开发,写错东西会提示的工具,它是这个东西的超超级加强版!
  • 静态分析是提出建议的,但并非所有的建议都是可取的,要理性对待(就像在Eclipse里的黄色警告,你都不一定会全部处理是一样的)

 

 

这个工具可能会发现的错误:

 

  • 变量声明了但未使用
  • 变量类型不匹配
  • 变量在使用前未定义
  • 不可达代码
  • 死循环
  • 数组越界
  • 内存泄漏

 

 

在什么情况下使用静态代码分析工具?

 

  • 代码审查
  • 代码自查
  • 代码规范
  • 代码编译前
 
摘图:
静态分析工具位置

 

 

针对C语言的开源程序静态分析工具——splint

splint

掌握了“静态分析”等概念之后,我们再来看splint

举一个小例子(摘文):

在Linux命令行下,splint的使用很简单,检测文件*.c,只要这样使用就可以了:

  1. splint splint_msg.c
splint消息

我们通过以下例子来认识典型的splint告警信息:

  1. //splint_msg.c
  2. int func_splint_msg1(void)
  3. {
  4. int a;
  5. return0;
  6. }
  7. int func_splint_msg2(void)
  8. {
  9. int* a =(int*)malloc(sizeof(int));
  10. a = NULL;
  11. return0;
  12. }
运行splint splint_msg.c之后,我们来看输出的告警信息:
  1. splint_msg.c:(in function func_splint_msg1)
  2. splint_msg.c:4:6:Variable a declared but not used
  3. A variable is declared but never used.Use/*@unused@*/ in front of
  4. declaration to suppress message.(Use-varuse to inhibit warning)
  5. splint_msg.c:(in function func_splint_msg2)
  6. splint_msg.c:10:2:Fresh storage a (type int*) not released before assignment:
  7. a = NULL
  8. A memory leak has been detected.Storage allocated locally is not released
  9. before the last reference to it is lost.(Use-mustfreefresh to inhibit
  10. warning)
  11. splint_msg.c:9:37:Fresh storage a created
  12. Finished checking ---2 code warnings

蓝色字体部分:给出告警所在函数名,在函数的第一个警告消息报告前打印;

红色字体部分:消息的正文,文件名、行号、列号显示在的警告的正文前;

黑色字体部分:是有关该可疑错误的详细信息,包含一些怎样去掉这个消息的信息;

绿色字体部分:给出格外的位置信息,这里消息给出了是在哪里申请了这个可能泄露的内存

 

检查控制

splint提供了三种方式可进行检查的控制,分别是.splintrc配置文件、flags标志和格式化注释。

flags:splint支持几百个标志用来控制检查和消息报告,使用时标志前加’+‘或’-’,'+'标志开启这个标志,'-'表示关闭此标志,下面例子展示了flags标志的用法:

splint -showcol a.c   //在检测a.c时,告警消息中列数不被打印
splint -varuse a.c //在检测a.c时,告警消息中未使用变量告警不被打印

.splintrc配置文件:在使用源码安装splint之后,.splintrc文件将被安装在主目录下,.splintrc文件中对一些标志作了默认的设定,命令行中指定的flags标志会覆盖.splintrc文件中的标志。

格式化注释:格式化注释提供一个类型、变量或函数的格外的信息,可以控制标志设置,增加检查效果,所有格式化注释都以/*@开始,@*/结束,比如在函数参数前加/*@null@*/,表示该参数可能是NULL,做检测时,splint会加强对该参数的值的检测

小结

现在,几乎是每一种语言都有静态语言分析工具,每一种语言分析的工具的能力有大有小,可以作参考使用,另外,值得注意的是,现在的工具,都可以搭配在GUI的界面上了 ,它也不再是一个丑陋的命令行工具了,这个是为了提高生产效率考虑的,所以当你寻找静态分析工具时,尽量使用界面化的工具(如Eclipse的插件等)

转载于:https://www.cnblogs.com/xujintao/p/7232457.html

代码静态分析工具PC-LINT安装配置 PC-Lint是C/C++软件代码静态分析工具,你可以把它看作是一种更加严格的编译器。它不仅可以检查出一般的语法错误,还可以检查出那些虽然符合语法要求但不易发现的潜在错误。 C语言的灵活性带来了代码效率的提升,但相应带来了代码编写的随意性,另外C编译器不进行强制类型检查,也带来了代码编写的隐患。PCLint识别并报告C语言中的编程陷阱和格式缺陷的发生。它进行程序的全局分析,能识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针,冗余的代码,等等。软件除错是软件项目开发成本和延误的主要因素。PClint能够帮你在程序动态测试之前发现编码错误。这样消除错误的成本更低。 使用PC-Lint在代码走读和单元测试之前进行检查,可以提前发现程序隐藏错误,提高代码质量,节省测试时间。并提供编码规则检查,规范软件人员的编码行为。 由于PC-LINT对于一般程序员来说可能比较陌生,有好多人安装了也不知道怎样配置和使用。 下面我就根据自己的安装和配置心得对PC-Lint的安装、配置及使用进行下详细说明.本人主要介绍了将PC-Lint集成到VC++6.0和SourceInsight的方法和步骤。 (一)Windows下C/C++开发工具中,VC6使用较为普遍,因此这里先讲下VC6.0环境中集成pclint的步骤. 首先, 当然要下载软件,正版软件要200多$呢,买不起!所以只好网上找免费的拉。从http://www.61ic.com/down/othe/pclint.rar处可以下载到一个8.0版本的pclint. 1.将pclint.rar解压至c:\, 这样lint文件就位与c:\pclint(安装目录)下了。 2.将c:\pclint\lnt 下的3个文件lib-w32.lnt,env-vc6.lnt,co-msc60.lnt拷贝至c:\pclint下, 再在安装目录下创建std.lnt和options.lnt两个文件,其中std.lnt的内容如下 // contents of std.lnt c:\pclint\co-msc60.lnt c:\pclint\lib-w32.lnt c:\pclint\options.lnt -si4 -sp4 -i"D:\Program Files;D:\Program Files\Microsoft Visual Studio\VC98\Include" //end 其中-i后面的路径名为VC的安装路径和VC Include 文件路径,根据自己的修改便可。 options.lnt 内容可为空,为定制内容,以后需要时再添加。 准备工作做完了,下一步就是要将pclint集成到VC6中去,先配置lint使之能对单个C或C++文件进行检查。 1.打开VC6,tools--->customize-->tools 新建一个名为pclint的项,在下面填入 command: C:\pclint\lint-nt.exe arguments: -u c:\pclint\std.lnt c:\pclint\env-vc6.lnt "$(FilePath)" Use Output Window 打上勾 close 完成。 这个在你VC窗口tools菜单下应该多了一个pclint选项,可以用它来运行lint程序,对你的c/c++代码进行静态检查了。 现在就可以用个小程序测试一下pclint了 //test1.cpp #include class X { int *p; public: X() { p = new int[20]; } void init() { memset( p, 20, 'a' ); } ~X() { delete p; } }; 编译这个文件,看下你的编译器给你多少警告,再运行下lint, 可以自己对比一下。 我的机器上,VC产生0 errors 0 warnings, 而lint程序产生了如下8条警告信息,有些还是很有用处的提示,这里就不一一分析了. test.cpp(12): error 783: (Info -- Line does not end with new-line) test.cpp(7): error 1732: (Info -- new in constructor for class 'X' which has no assignment operator) test.cpp(7): error 1733: (Info -- new in constructor for class 'X' which has no copy constru
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值