These tests don't bother to free memory before exit, but that means we get ASan errors for them. Fixed like so.
* testsuite/abi/pr42230.cc: Free memory. * testsuite/util/testsuite_abi.cc (demangle): Return std::string instead of pointer that might need freeing. * testsuite/util/testsuite_abi.h (demangle): Likewise. * testsuite/util/testsuite_hooks.cc (verify_demangle): Free memory. Tested powerpc64le-linux, committed to trunk.
commit 6442c85d107824319d19b36799682335d8133689 Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed Jul 20 22:49:44 2016 +0100 Fix memory leaks in libstdc++ ABI tests * testsuite/abi/pr42230.cc: Free memory. * testsuite/util/testsuite_abi.cc (demangle): Return std::string instead of pointer that might need freeing. * testsuite/util/testsuite_abi.h (demangle): Likewise. * testsuite/util/testsuite_hooks.cc (verify_demangle): Free memory. diff --git a/libstdc++-v3/testsuite/abi/pr42230.cc b/libstdc++-v3/testsuite/abi/pr42230.cc index 2a33899..3b5a1f6 100644 --- a/libstdc++-v3/testsuite/abi/pr42230.cc +++ b/libstdc++-v3/testsuite/abi/pr42230.cc @@ -12,5 +12,6 @@ int main() char* ret = abi::__cxa_demangle("e", 0, &length, &cc); assert( (cc < 0 && !ret) || (ret && length) ); + std::free(ret); return 0; } diff --git a/libstdc++-v3/testsuite/util/testsuite_abi.cc b/libstdc++-v3/testsuite/util/testsuite_abi.cc index 4d7f4ca..d18429a 100644 --- a/libstdc++-v3/testsuite/util/testsuite_abi.cc +++ b/libstdc++-v3/testsuite/util/testsuite_abi.cc @@ -590,21 +590,26 @@ create_symbols(const char* file) } -const char* +std::string demangle(const std::string& mangled) { - const char* name; + std::string name; if (mangled[0] != '_' || mangled[1] != 'Z') { // This is not a mangled symbol, thus has "C" linkage. - name = mangled.c_str(); + name = mangled; } else { // Use __cxa_demangle to demangle. int status = 0; - name = abi::__cxa_demangle(mangled.c_str(), 0, 0, &status); - if (!name) + char* ptr = abi::__cxa_demangle(mangled.c_str(), 0, 0, &status); + if (ptr) + { + name = ptr; + free(ptr); + } + else { switch (status) { diff --git a/libstdc++-v3/testsuite/util/testsuite_abi.h b/libstdc++-v3/testsuite/util/testsuite_abi.h index 8275b23..77c5656 100644 --- a/libstdc++-v3/testsuite/util/testsuite_abi.h +++ b/libstdc++-v3/testsuite/util/testsuite_abi.h @@ -94,5 +94,5 @@ compare_symbols(const char* baseline_file, const char* test_file, bool verb); symbols create_symbols(const char* file); -const char* +std::string demangle(const std::string& mangled); diff --git a/libstdc++-v3/testsuite/util/testsuite_hooks.cc b/libstdc++-v3/testsuite/util/testsuite_hooks.cc index d1063e3..74e755d 100644 --- a/libstdc++-v3/testsuite/util/testsuite_hooks.cc +++ b/libstdc++-v3/testsuite/util/testsuite_hooks.cc @@ -131,8 +131,11 @@ namespace __gnu_test verify_demangle(const char* mangled, const char* wanted) { int status = 0; - const char* s = abi::__cxa_demangle(mangled, 0, 0, &status); - if (!s) + const char* s = 0; + char* demangled = abi::__cxa_demangle(mangled, 0, 0, &status); + if (demangled) + s = demangled; + else { switch (status) { @@ -156,6 +159,7 @@ namespace __gnu_test std::string w(wanted); if (w != s) std::__throw_runtime_error(s); + free(demangled); } void