我只是一个在沙滩上捡贝壳的小男孩,梦想有一天可以发现知识的真理~~~

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

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

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

这里有这么几个关键词:

 

  • 代码运行前:很明显,这个工具就是对文本代码进行分析的,不用编译等等
  • 检查:它是一个具有一定的分析智能的工具,可以分析出野指针,未达代码等错误的工具,而不是一个简简单单的类似于在一个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的插件等)

posted @ 2017-07-25 10:01  瓜不甜  阅读(3704)  评论(0编辑  收藏  举报

全栈开发工程师 - 一只菜鸟的成长之路

这是一位软件开发工程师的个人站,内容主要是网站开发方面的技术文章,大部分来自学习或工作,部分来源于网络,希望对大家有所帮助。

联系我:2351180282@qq.com