aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2017-07-06 13:42:46 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2017-07-06 13:42:46 +0100
commit4f7c2c7ff2374cb39386f627fa97e2363dd2f94d (patch)
treeed20d6711dcaa1ff2713b42a3424fcc860cd8f67
parent318c48e30402eadaeee86dee9486733678c5fef4 (diff)
downloadgcc-4f7c2c7ff2374cb39386f627fa97e2363dd2f94d.zip
gcc-4f7c2c7ff2374cb39386f627fa97e2363dd2f94d.tar.gz
gcc-4f7c2c7ff2374cb39386f627fa97e2363dd2f94d.tar.bz2
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. From-SVN: r250020
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/testsuite/abi/pr42230.cc1
-rw-r--r--libstdc++-v3/testsuite/util/testsuite_abi.cc15
-rw-r--r--libstdc++-v3/testsuite/util/testsuite_abi.h2
-rw-r--r--libstdc++-v3/testsuite/util/testsuite_hooks.cc8
5 files changed, 24 insertions, 8 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 1c50a3b..be9813a 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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
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