本文为valgrind的学习笔记,参考资料为:http://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/ 建议大家阅读原文。
使用C开发大型程序,经常会因为指针问题而出现内容泄漏,这种泄漏难以检出,需要使用valgrind工具可以检测。
Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。Valgrind这个名字取自北欧神话中英灵殿的入口。Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O'Reilly开源代码奖。Valgrind遵守GNU通用公共许可证条款,是一款自由软件。到3.3.0版本为止,Valgrind支持x86、x86-64以及PowerPC上的Linux。除此之外,还有一些其它非正式支持的类Unix平台(如FreeBSD、NetBSD以及Mac OS X)。
Valgrind的使用
例1 valgrind操作
代码sample.c
#include <stdlib.h>
void fun()
{
int *p = (int*)malloc(10*sizeof(int));
p[10] = 0;
}
int main(int argc,char* argv[])
{
fun();
return 0;
}
编译
gcc –g –O0 sample.c –o sample
执行valgrind ./sample.c

第一部分为具体的出错信息, 可以看出两个错;第二部分为summary.
例2 使用未初始化内存
文件badloop.c
#include <stdio.h>
int main(void)
{
int a[5];
int i;
int s;
a[0] = a[1] = a[2] = a[3] = a[4] = 0;
for(i=0; i <5 ; i++)
{
s += a[i];
}
if(s == 377)
{
printf("sum is %d\n",s);
}
return 0;
}
valgrind的输出为:

在程序的if语句中使用了未初始化的变量s。
例3 内存读写越界
文件badacc.c为
1 #include <stdlib.h>
2 #include <stdio.h>
3
4 int main(int argc,char * argv[])
5 {
6 int len = 4;
7 int i;
8 int* pt = (int*)malloc(len*sizeof(int));
9 int* p = pt;
10
11 for(i=0; i<len; i++)
12 {
13 p++;
14 }
15
16 *p = 5;
17 printf("the value of p equal:%d",*p);
18 return 0;
19 }
valgrind的输出为:

两个错误,非法写与非法读。
例4 内存覆盖
文件badlap.c为
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main(int argc,char* argv[])
6 {
7 char x[50];
8 int i;
9 for(i=0;i<50;i++)
10 {
11 x[i] = i+1;
12 }
13
14 strncpy(x+20,x,20);
15 strncpy(x+20,x,21);
16 strncpy(x,x+20,20);
17 strncpy(x,x+21,21);
18
19 x[39] = '\0';
20 strcpy(x,x+20);
21
22 x[39] = 39;
23 x[40] = '\0';
24 strcpy(x,x+20);
25
26 return 0;
27 }
valgrind的结果为:

例5 动态内存管理错误
文件badmac.c:
1 #include <stdlib.h>
2 #include <stdio.h>
3
4 int main(int argc,char *argv[])
5 {
6 int i;
7 char* p = (char*)malloc(10);
8 char* pt = p;
9
10 for(i=0; i<10; i++)
11 {
12 p[i] = 'z';
13 }
14 delete p;
15 pt[1] = 'x';
16 free(pt);
17 return 0;
18 }
valgrind的执行结果为:
