From: Philippe Waroquiers Date: Mon, 30 Sep 2013 21:17:09 +0000 (+0000) Subject: Use global vars to point at possibly leaked X-Git-Tag: svn/VALGRIND_3_9_0~100 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0925d04c4e58afb15845c8e45fc83905d6767cce;p=thirdparty%2Fvalgrind.git Use global vars to point at possibly leaked Depending on the compiler or optimisation level, the blocks that are supposed to be possibly leaked are still reachable. => change the pointers to be global variables, and do the allocation in a function, not in main. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13591 --- diff --git a/memcheck/tests/leak_cpp_interior.cpp b/memcheck/tests/leak_cpp_interior.cpp index e380403308..ac1850a237 100644 --- a/memcheck/tests/leak_cpp_interior.cpp +++ b/memcheck/tests/leak_cpp_interior.cpp @@ -65,21 +65,37 @@ struct C : public A, public B } }; -int main() { - std::string str = "Valgrind"; // interior ptr. - std::string str2 = str; - MyClass *ptr = new MyClass[3]; // interior ptr. - MyClass *ptr2 = new MyClass[0]; // "interior but exterior ptr". - // ptr2 points after the chunk, is wrongly considered by memcheck as definitely leaked. +std::string str; +std::string str2; +MyClass *ptr; +MyClass *ptr2; +Be *ptrBCe; +Ae *ptrACe; +B *ptrBC; +A *ptrAC; + - Be *ptrBCe = new Ce; // interior ptr. - Ae *ptrACe = new Ce; // not an interior pointer. - B *ptrBC = new C; // interior ptr. - A *ptrAC = new C; // not an interior pointer. +void doit(void) +{ + str = "Valgrind"; // interior ptr. + str2 = str; + ptr = new MyClass[3]; // interior ptr. + ptr2 = new MyClass[0]; // "interior but exterior ptr". + // ptr2 points after the chunk, is wrongly considered by memcheck as definitely leaked. + ptrBCe = new Ce; // interior ptr. + ptrACe = new Ce; // not an interior pointer. + ptrBC = new C; // interior ptr. + ptrAC = new C; // not an interior pointer. + + + str2 += " rocks (str2)\n"; // interior ptr. +} - str2 += " rocks (str2)\n"; // interior ptr. +int main() { + + doit(); VALGRIND_MONITOR_COMMAND("v.set log_output"); fprintf(stderr, "VALGRIND_DO_LEAK_CHECK\n"); diff --git a/memcheck/tests/leak_cpp_interior.stderr.exp b/memcheck/tests/leak_cpp_interior.stderr.exp index bbecf9871f..769c00e8d4 100644 --- a/memcheck/tests/leak_cpp_interior.stderr.exp +++ b/memcheck/tests/leak_cpp_interior.stderr.exp @@ -2,7 +2,8 @@ valgrind output will go to log VALGRIND_DO_LEAK_CHECK 4 bytes in 1 blocks are definitely lost in loss record ... of ... - by 0x........: main (leak_cpp_interior.cpp:72) + by 0x........: doit() (leak_cpp_interior.cpp:83) + by 0x........: main (leak_cpp_interior.cpp:98) LEAK SUMMARY: definitely lost: 4 bytes in 1 blocks diff --git a/memcheck/tests/leak_cpp_interior.stderr.exp-64bit b/memcheck/tests/leak_cpp_interior.stderr.exp-64bit index 72348739cd..49b2dedd31 100644 --- a/memcheck/tests/leak_cpp_interior.stderr.exp-64bit +++ b/memcheck/tests/leak_cpp_interior.stderr.exp-64bit @@ -2,7 +2,8 @@ valgrind output will go to log VALGRIND_DO_LEAK_CHECK 8 bytes in 1 blocks are definitely lost in loss record ... of ... - by 0x........: main (leak_cpp_interior.cpp:72) + by 0x........: doit() (leak_cpp_interior.cpp:83) + by 0x........: main (leak_cpp_interior.cpp:98) LEAK SUMMARY: definitely lost: 8 bytes in 1 blocks