在上一篇博文中已经介绍过什么是静态内存分析,静态内存分析可以检测程序的哪些逻辑问题。上篇博文主要讲解cppcheck工具在linux下的使用,这篇博文主要讲解splint工具可以检测哪些代码逻辑,与cppcheck又有哪些区别。
一、 什么是splint
(原来的 LCLint) 是一个GNU免费授权的 Lint程序,是一个动态检查C语言程序安全弱点和编写错误的程序。Splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误。
二、 splint与cppcheck的区别
首先第一个区别就是,cppcheck在Jenkins下有插件支持,而splint则没有。另外splint比cppcheck检测得更加严谨,但是这也是依据版本而定,所以也不能很确定的下结论。
三、如何在linux下安装splint
官网:http://splint.org/download.html
Linux下安装:
四、 实例
还是使用这个测试代码,并且顺便看看使用splint工具与cppcheck工具检测的结果进行对比。
源码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
/* code */
double a;
int * p;
int b;
int c[2];
b = 1;
a = b; //使用不当的类型转换
p = (int *)malloc(10); //申请的内存未释放
c[2] = 1; //数组访问越界
printf("%d\n", b);
if(a = 5)
{
printf("check error\n");
}
return 0;
}
使用splint工具:
使用cppcheck工具:
从对比中可以看出,使用splint工具,可以更加严谨的检测出语法异常,比如说if语句。当然这只是简单的例子,从经验上以及可以的角度上看,他们认为静态检测只是比编译器更加严谨的一点,但是并不能作为判断内存泄露的依据。我也做过试验,cppcheck的不同版本,检测的效果是不一样的,所以至今,静态内存泄露检测只是作为一种辅助工具,只能发现一些容易被忽略的问题,并不能解决根本问题。所以还是推荐使用动态内存检测。