diff mbox

Fix memory leaks in libstdc++ ABI tests

Message ID 20170706124239.GA27572@redhat.com
State New
Headers show

Commit Message

Jonathan Wakely July 6, 2017, 12:42 p.m. UTC
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 <jwakely@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 mbox

Patch

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