什么是静态代码分析工具呢?
用一句最直白的话就是:在代码运行前的一个检查代码规范,错误等的分析并提出建议的工具
这里有这么几个关键词:
- 代码运行前:很明显,这个工具就是对文本代码进行分析的,不用编译等等
- 检查:它是一个具有一定的分析智能的工具,可以分析出野指针,未达代码等错误的工具,而不是一个简简单单的类似于在一个IDE里开发,写错东西会提示的工具,它是这个东西的超超级加强版!
- 静态分析是提出建议的,但并非所有的建议都是可取的,要理性对待(就像在Eclipse里的黄色警告,你都不一定会全部处理是一样的)
这个工具可能会发现的错误:
- 变量声明了但未使用
- 变量类型不匹配
- 变量在使用前未定义
- 不可达代码
- 死循环
- 数组越界
- 内存泄漏
在什么情况下使用静态代码分析工具?
- 代码审查
- 代码自查
- 代码规范
- 代码编译前
![静态分析工具位置](https://images2015.cnblogs.com/blog/881259/201707/881259-20170725100038281-1759683547.jpg)
针对C语言的开源程序静态分析工具——splint。
splint
掌握了“静态分析”等概念之后,我们再来看splint
举一个小例子(摘文):
在Linux命令行下,splint的使用很简单,检测文件*.c,只要这样使用就可以了:
splint splint_msg.c
我们通过以下例子来认识典型的splint告警信息:
//splint_msg.c
int func_splint_msg1(void)
{
int a;
return0;
}
int func_splint_msg2(void)
{
int* a =(int*)malloc(sizeof(int));
a = NULL;
return0;
}
splint_msg.c:(in function func_splint_msg1)
splint_msg.c:4:6:Variable a declared but not used
A variable is declared but never used.Use/*@unused@*/ in front of
declaration to suppress message.(Use-varuse to inhibit warning)
splint_msg.c:(in function func_splint_msg2)
splint_msg.c:10:2:Fresh storage a (type int*) not released before assignment:
a = NULL
A memory leak has been detected.Storage allocated locally is not released
before the last reference to it is lost.(Use-mustfreefresh to inhibit
warning)
splint_msg.c:9:37:Fresh storage a created
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的插件等)