Fix memory leaks in libstdc++ ABI tests
authorJonathan Wakely <jwakely@redhat.com>
Thu, 6 Jul 2017 12:42:46 +0000 (13:42 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 6 Jul 2017 12:42:46 +0000 (13:42 +0100)
* 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.

From-SVN: r250020

libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/abi/pr42230.cc
libstdc++-v3/testsuite/util/testsuite_abi.cc
libstdc++-v3/testsuite/util/testsuite_abi.h
libstdc++-v3/testsuite/util/testsuite_hooks.cc

index 1c50a3b2b4c9b1fd10280d9eb9add5a2bc4d3425..be9813a08b199ff2b36f0ec21edf466210e7f124 100644 (file)
@@ -1,5 +1,11 @@
 2017-07-06  Jonathan Wakely  <jwakely@redhat.com>
 
+       * 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.
+
        * include/bits/uses_allocator.h (__use_alloc(const _Alloc&&)): Add
        deleted overload to prevent dangling references to rvalues.
        * include/experimental/memory_resource
index 2a33899533626d7ff1969b2e22cbb62da0d13b8a..3b5a1f6c2421db82714e69f947595bfd83b8db04 100644 (file)
@@ -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;
 }
index 4d7f4ca3a65ba9eed53e5b4ba4124389cb891eef..d18429a55b2d633f5c05338e71c1e869e6cc1400 100644 (file)
@@ -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)
            {
index 8275b23e1626fdd68516b01db1b9ebc9f25b5dda..77c5656177f9d709fe653ec8de6658da7cdb2195 100644 (file)
@@ -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);
index d1063e3d8d753fbc35bc004b94636879ada3c648..74e755dfe287eee6a72bd7652e6842ecb817cffc 100644 (file)
@@ -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