summaryrefslogtreecommitdiff
path: root/bridges
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2017-11-14 11:44:12 +0100
committerStephan Bergmann <sbergman@redhat.com>2017-11-14 11:44:12 +0100
commit80cbc18c6d79f6dfb1d7ed8c03b216983298e1b3 (patch)
treef3c070e3a0caabd65371072c8fb1ac2ef687e2da /bridges
parent34efaa8a7508ea73f7aa6e41e6ff4682f2772af3 (diff)
Fix ASan "alloc-dealloc-mismatch (operator new [] vs operator delete)"
...e.g. during CppunitTest_smoketest, after be2d9d3407ddae22797879e93778513be30ec5aa "Clean up m_generatedRttis at exit" Change-Id: Ife4b07927ba11cf5b99e987b3bb9af068652ba62
Diffstat (limited to 'bridges')
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx88
1 files changed, 64 insertions, 24 deletions
diff --git a/bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx b/bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx
index 844cd1038449..038f88f1d18e 100644
--- a/bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx
@@ -28,6 +28,7 @@
#include <dlfcn.h>
+#include <o3tl/make_unique.hxx>
#include <osl/mutex.hxx>
#include <rtl/instance.hxx>
#include <rtl/strbuf.hxx>
@@ -40,6 +41,37 @@
namespace {
+class Generated {
+public:
+ virtual ~Generated() {};
+
+ virtual std::type_info * get() const = 0;
+};
+
+class GeneratedPlain: public Generated {
+public:
+ GeneratedPlain(std::unique_ptr<std::type_info> && info): info_(std::move(info)) {};
+
+ std::type_info * get() const override { return info_.get(); }
+
+private:
+ std::unique_ptr<std::type_info> info_;
+};
+
+class GeneratedPad: public Generated {
+public:
+public:
+ GeneratedPad(std::unique_ptr<char[]> && pad): pad_(std::move(pad)) {};
+
+ ~GeneratedPad() override { get()->~type_info(); }
+
+ std::type_info * get() const override
+ { return reinterpret_cast<std::type_info *>(pad_.get()); }
+
+private:
+ std::unique_ptr<char[]> pad_;
+};
+
class RTTI
{
typedef std::unordered_map< OUString, std::type_info * > t_rtti_map;
@@ -47,8 +79,7 @@ class RTTI
osl::Mutex m_mutex;
t_rtti_map m_rttis;
std::vector<OString> m_rttiNames;
- std::unordered_map<OUString, std::unique_ptr<std::type_info>>
- m_generatedRttis;
+ std::unordered_map<OUString, std::unique_ptr<Generated>> m_generatedRttis;
void * m_hApp;
@@ -115,7 +146,7 @@ std::type_info * RTTI::getRTTI(typelib_TypeDescription const & pTypeDescr)
#if OSL_DEBUG_LEVEL > 1
fprintf( stderr,"generated rtti for %s\n", rttiName );
#endif
- std::unique_ptr<std::type_info> newRtti;
+ std::unique_ptr<Generated> newRtti;
switch (pTypeDescr.eTypeClass) {
case typelib_TypeClass_EXCEPTION:
{
@@ -129,15 +160,18 @@ std::type_info * RTTI::getRTTI(typelib_TypeDescription const & pTypeDescr)
std::type_info * base_rtti = getRTTI(
ctd.pBaseTypeDescription->aBase);
m_rttiNames.emplace_back(OString(rttiName));
- newRtti.reset(
+ std::unique_ptr<std::type_info> info(
new __cxxabiv1::__si_class_type_info(
m_rttiNames.back().getStr(), static_cast<__cxxabiv1::__class_type_info *>(base_rtti) ));
+ newRtti.reset(new GeneratedPlain(std::move(info)));
}
else
{
// this class has no base class
m_rttiNames.emplace_back(OString(rttiName));
- newRtti.reset(new __cxxabiv1::__class_type_info(m_rttiNames.back().getStr()));
+ std::unique_ptr<std::type_info> info(
+ new __cxxabiv1::__class_type_info(m_rttiNames.back().getStr()));
+ newRtti.reset(new GeneratedPlain(std::move(info)));
}
break;
}
@@ -153,30 +187,36 @@ std::type_info * RTTI::getRTTI(typelib_TypeDescription const & pTypeDescr)
}
switch (itd.nBaseTypes) {
case 0:
- m_rttiNames.emplace_back(OString(rttiName));
- newRtti.reset(
- new __cxxabiv1::__class_type_info(
- m_rttiNames.back().getStr()));
- break;
+ {
+ m_rttiNames.emplace_back(OString(rttiName));
+ std::unique_ptr<std::type_info> info(
+ new __cxxabiv1::__class_type_info(
+ m_rttiNames.back().getStr()));
+ newRtti.reset(new GeneratedPlain(std::move(info)));
+ break;
+ }
case 1:
- m_rttiNames.emplace_back(OString(rttiName));
- newRtti.reset(
- new __cxxabiv1::__si_class_type_info(
- m_rttiNames.back().getStr(),
- static_cast<
- __cxxabiv1::__class_type_info *>(
- bases[0])));
- break;
+ {
+ m_rttiNames.emplace_back(OString(rttiName));
+ std::unique_ptr<std::type_info> info(
+ new __cxxabiv1::__si_class_type_info(
+ m_rttiNames.back().getStr(),
+ static_cast<
+ __cxxabiv1::__class_type_info *>(
+ bases[0])));
+ newRtti.reset(new GeneratedPlain(std::move(info)));
+ break;
+ }
default:
{
m_rttiNames.emplace_back(OString(rttiName));
- char * pad = new char[
+ auto pad = o3tl::make_unique<char[]>(
sizeof (__cxxabiv1::__vmi_class_type_info)
+ ((itd.nBaseTypes - 1)
* sizeof (
- __cxxabiv1::__base_class_type_info))];
+ __cxxabiv1::__base_class_type_info)));
__cxxabiv1::__vmi_class_type_info * info
- = new(pad)
+ = new(pad.get())
__cxxabiv1::__vmi_class_type_info(
m_rttiNames.back().getStr(),
__cxxabiv1::__vmi_class_type_info::__flags_unknown_mask);
@@ -191,7 +231,7 @@ std::type_info * RTTI::getRTTI(typelib_TypeDescription const & pTypeDescr)
= (__cxxabiv1::__base_class_type_info::__public_mask
| ((8 * i) << __cxxabiv1::__base_class_type_info::__offset_shift));
}
- newRtti.reset(info);
+ newRtti.reset(new GeneratedPad(std::move(pad)));
break;
}
}
@@ -200,7 +240,7 @@ std::type_info * RTTI::getRTTI(typelib_TypeDescription const & pTypeDescr)
default:
assert(false); // cannot happen
}
- rtti = newRtti.get();
+ rtti = newRtti->get();
if (newRtti) {
auto insertion (
m_generatedRttis.emplace(unoName, std::move(newRtti)));
@@ -209,7 +249,7 @@ std::type_info * RTTI::getRTTI(typelib_TypeDescription const & pTypeDescr)
}
else // taking already generated rtti
{
- rtti = iFind2->second.get();
+ rtti = iFind2->second->get();
}
}
}