【内存泄漏】- 3. 使用splint检测c、c++内存泄漏

版权声明:欢迎交流 https://blog.csdn.net/sishuihuahua/article/details/85727910

        在上一篇博文中已经介绍过什么是静态内存分析,静态内存分析可以检测程序的哪些逻辑问题。上篇博文主要讲解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的不同版本,检测的效果是不一样的,所以至今,静态内存泄露检测只是作为一种辅助工具,只能发现一些容易被忽略的问题,并不能解决根本问题。所以还是推荐使用动态内存检测。

猜你喜欢

转载自blog.csdn.net/sishuihuahua/article/details/85727910
今日推荐