ref-count assertion in cppu::OWeakObject ...

Michael Meeks michael.meeks at suse.com
Mon Aug 6 04:53:23 PDT 2012


So,

	I was wondering reading:

	https://bugs.freedesktop.org/show_bug.cgi?id=53154#c5

	"...either memory corruption or a ref-counted UNO object
	forcefully being deleted before its ref-count is zero"

	It seemed to me that we could catch the latter case and avoid it
causing problems later, at least for people using the standard classes.
So I was thinking of:

--- a/cppuhelper/source/weak.cxx
+++ b/cppuhelper/source/weak.cxx
@@ -235,6 +235,9 @@ void OWeakObject::disposeWeakConnectionPoint()
 
 OWeakObject::~OWeakObject() SAL_THROW( (RuntimeException) )
 {
+    fprintf( stderr, "~OWeakObject: %d\n", (int)m_refCount );
+    if (m_refCount != 0)
+        abort(); // memory corruption coming ...
 }
 
 // XWeak

	Which kills ~1200 objects until we get to:

...
  1222	~OWeakObject: 0
  1223	~OWeakObject: 1

	With a trace from the (already somewhat suspicious lifecycle-wise IMHO)
package/ code:

#1  0xb7c8e1d5 in __GI_abort () at abort.c:93
#2  0xb7a7e66d in cppu::OWeakObject::~OWeakObject (this=0xb07a79b0, __in_chrg=<optimized out>)
    at /data/opt/libreoffice/master/cppuhelper/source/weak.cxx:239
#3  0xb0478280 in cppu::WeakImplHelper5<com::sun::star::packages::zip::XZipFileAccess, com::sun::star::container::XNameAccess, com::sun::star::lang::XInitialization, com::sun::star::lang::XComponent, com::sun::star::lang::XServiceInfo>::~WeakImplHelper5 (this=0xb07a79b0, 
    __in_chrg=<optimized out>) at /data/opt/libreoffice/master/solver/unxlngi6.pro/inc/cppuhelper/implbase5.hxx:107
#4  0xb0476a69 in OZipFileAccess::~OZipFileAccess (this=0xb07a79b0, __in_chrg=<optimized out>)
    at /data/opt/libreoffice/master/package/source/zippackage/zipfileaccess.cxx:53
#5  0xb0476af6 in OZipFileAccess::~OZipFileAccess (this=0xb07a79b0, __in_chrg=<optimized out>)
    at /data/opt/libreoffice/master/package/source/zippackage/zipfileaccess.cxx:66
#6  0xb7a7e9b5 in release (this=0xb07a79b0) at /data/opt/libreoffice/master/cppuhelper/source/weak.cxx:213
#7  cppu::OWeakObject::release (this=0xb07a79b0) at /data/opt/libreoffice/master/cppuhelper/source/weak.cxx:206
#8  0xb04781ee in cppu::WeakImplHelper5<com::sun::star::packages::zip::XZipFileAccess, com::sun::star::container::XNameAccess, com::sun::star::lang::XInitialization, com::sun::star::lang::XComponent, com::sun::star::lang::XServiceInfo>::release (this=0xb07a79b0)
    at /data/opt/libreoffice/master/solver/unxlngi6.pro/inc/cppuhelper/implbase5.hxx:119
...

	Which makes me wonder - reading:

void SAL_CALL OWeakObject::release() throw()
{
    if (osl_decrementInterlockedCount( &m_refCount ) == 0) {
        // notify/clear all weak-refs before object's dtor is executed
        // (which may check weak-refs to this object):
        disposeWeakConnectionPoint();
        // destroy object:
        delete this;
    }
}

	Who tries to take an additional reference during the weak connection
notification process, and - what are they doing with it ? :-)

	Anyhow - the suggestion is, assuming we can find/cleanup this sort of
badness [ incidentally a GObject takes a reference on itself during it's
destruction to avoid double destruction ], is it a good idea to have an
abort/assert whatever is fashionable in run-time code so we can be
confident that we have caught these cases earlier ? I for one prefer an
assertion-fail abort-app to a hard-to-catch memory corrupter later.

	Thoughts ?

		Michael.

-- 
michael.meeks at suse.com  <><, Pseudo Engineer, itinerant idiot



More information about the LibreOffice mailing list