valgrind学习笔记

本文为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的执行结果为:




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值