#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 ;
}
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
段错误
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
==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