Valgrind 简单实用(转载+修正)

#include  < iostream >

using   namespace  std;

// mytest.cpp
int  main( int  argc,  char   *  argv[])
// line 120
  const   int  N = 10 ;               //  # of elements in array
  const   int  g_nLargeRange  =   500   *   1024   *   1024 ;

 cout 
<<   " Start of tests "   <<  endl;
 
int   * p1  =   new   int ( 1 );       //  use to cause leak
  int   * p2  =   new   int [N];       //  allocate an int array
  int   * p3  =   new   int ( 2 );       //  used to test wrong delete
  char   * cp  =   0 ;               //  cp is null pointer
  char  ca[ 3 ];                 //  unintialized array
  char   *  pLarge  =  NULL;     //  used to test set address range perms: large range
 cout  <<   " Test 1: off by one "   <<  endl;
 
for  ( int  i = 1 ; i < N + 1 ; i ++ )   //  one-off in loop
  p2[i]  =  i;                //  err - initialize element p[N]
 cout  <<   " Test 2: access freed storage "   <<  endl;
 delete p1;
 
* p1  =   3 ;                    //  err - accessing freed storage
 cout  <<   " Test 3: using uninitialized storage "   <<  endl;
 
if  (p2[ 0 ]) cout  <<   " Junk "   <<  endl; //  err - used uninit data
 cout  <<   " Test 4: delete array using scalar delete "   <<  endl;
 delete p2;                 
//  err - delete array with scalar delete
 cout  <<   " Test 5: array delete of scalar "   <<  endl;
 delete [] p3;              
//  err - array delete of scalar
 cout  <<   " Test 6: overlapping storage blocks "   <<  endl;
 memcpy( ca, 
& ca[ 1 ], 2  );     //  err - overlapping storage blocks
 cout  <<   " Test 7: system call using uninitialize data "   <<  endl;
 sleep( 
1   &  ca[ 0 ] );             //  err - uninit data in system call
 cout  <<   " Test 8: set address range perms: large range "   <<  endl;
 pLarge 
=   new   char [g_nLargeRange];
 cout 
<<   " Test 9: assign to null pointer - seg faults "   <<  endl;
 
* cp  =   ' a ' ;                  //  err - used null pointer (Seg fauilts)
 cout  <<   " End of tests "   <<  endl;
 
return   0 ;
}

 

运行 g++ -o a a.cpp

valgrind --tool=memcheck --num-callers=50 --leak-check=full  --log-file=memcheck ./a

 

屏幕输出

 

Start of tests
Test 
1 : off by one
Test 
2 : access freed storage
Test 
3 using  uninitialized storage
Test 
4 : delete array  using  scalar delete
Test 
5 : array delete of scalar
Test 
6 : overlapping storage blocks
Test 
7 : system call  using  uninitialize data
Test 
8 set  address range perms: large range
Test 
9 : assign to  null  pointer  -  seg faults
段错误

 

日志

 

==29816== Memcheck, a memory error detector.
==29816== Copyright (C) 2002-2008, and GNU GPL'd, by Julian Seward et al.
==29816== Using LibVEX rev 1884, a library for dynamic binary translation.
==29816== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP.
==29816== Using valgrind-3.4.1, a dynamic binary instrumentation framework.
==29816== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al.
==29816== For more details, rerun with: -v
==29816==
==29816== My PID = 29816, parent PID = 26483.  Prog and args are:
==29816==    ./a
==29816==
==29816== Invalid write of size 4
==29816==    at 0x804887B: main (a.cpp:20)
==29816==  Address 0x401c088 is 0 bytes after a block of size 40 alloc'd
==29816==    at 0x4005515: operator new[](unsigned int) (vg_replace_malloc.c:268)
==29816==    by 0x8048819: main (a.cpp:13)
==29816==
==29816== Invalid write of size 4
==29816==    at 0x80488B9: main (a.cpp:23)
==29816==  Address 0x401c028 is 0 bytes inside a block of size 4 free'd
==29816==    at 0x4005BD1: operator delete(void*) (vg_replace_malloc.c:342)
==29816==    by 0x80488B5: main (a.cpp:22)
==29816==
==29816== Conditional jump or move depends on uninitialised value(s)
==29816==    at 0x80488EA: main (a.cpp:25)
==29816==
==29816== Mismatched free() / delete / delete []
==29816==    at 0x4005BD1: operator delete(void*) (vg_replace_malloc.c:342)
==29816==    by 0x804893E: main (a.cpp:27)
==29816==  Address 0x401c060 is 0 bytes inside a block of size 40 alloc'd
==29816==    at 0x4005515: operator new[](unsigned int) (vg_replace_malloc.c:268)
==29816==    by 0x8048819: main (a.cpp:13)
==29816==
==29816== Mismatched free() / delete / delete []
==29816==    at 0x4005F61: operator delete[](void*) (vg_replace_malloc.c:364)
==29816==    by 0x8048973: main (a.cpp:29)
==29816==  Address 0x401c0b8 is 0 bytes inside a block of size 4 alloc'd
==29816==    at 0x400502D: operator new(unsigned int) (vg_replace_malloc.c:224)
==29816==    by 0x8048828: main (a.cpp:14)
==29816==
==29816== Conditional jump or move depends on uninitialised value(s)
==29816==    at 0xA8F7AC: sleep (in /lib/libc-2.5.so)
==29816==    by 0x80489DC: main (a.cpp:33)
==29816== Warning: set address range perms: large range [0x884a028, 0x27c4a028) (undefined)
==29816==
==29816== Invalid write of size 1
==29816==    at 0x8048A37: main (a.cpp:37)
==29816==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==29816==
==29816== Process terminating with default action of signal 11 (SIGSEGV)
==29816==  Access not within mapped region at address 0x0
==29816==    at 0x8048A37: main (a.cpp:37)
==29816==  If you believe this happened as a result of a stack overflow in your
==29816==  program's main thread (unlikely but possible), you can try to increase
==29816==  the size of the main thread stack using the --main-stacksize= flag.
==29816==  The main thread stack size used in this run was 10485760.
==29816==
==29816== ERROR SUMMARY: 7 errors from 7 contexts (suppressed: 15 from 1)
==29816== malloc/free: in use at exit: 524,288,000 bytes in 1 blocks.
==29816== malloc/free: 4 allocs, 3 frees, 524,288,048 bytes allocated.
==29816== For counts of detected errors, rerun with: -v
==29816== Use --track-origins=yes to see where uninitialised values come from
==29816== searching for pointers to 1 not-freed blocks.
==29816== checked 87,856 bytes.
==29816==
==29816== LEAK SUMMARY:
==29816==    definitely lost: 0 bytes in 0 blocks.
==29816==      possibly lost: 0 bytes in 0 blocks.
==29816==    still reachable: 524,288,000 bytes in 1 blocks.
==29816==         suppressed: 0 bytes in 0 blocks.
==29816== Reachable blocks (those to which a pointer was found) are not shown.
==29816== To see them, rerun with: --leak-check=full --show-reachable=yes

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值