LO, scan coverity 708945 (non virtual destructor in parent class)

julien2412 serval2412 at yahoo.fr
Sat Dec 7 09:17:40 PST 2013


Hi,

I took a look to
https://scan5.coverity.com:8443/reports.htm#v22002/p10276/fileInstanceId=47958646&defectInstanceId=14481124&mergedDefectId=708945
 32class SbxVarEntry : public SbxVariableRef {
 33public:
 34    OUString* pAlias;
 35    SbxVarEntry() : SbxVariableRef(), pAlias( NULL ) {}
  
CID 708945 (#1 of 1): Non-virtual destructor (VIRTUAL_DTOR)1.
nonvirtual_dtor: Class SbxVarEntry has a destructor and a pointer to it is
upcast to class SbxVariableRef which doesn't have a virtual destructor.
 36   ~SbxVarEntry() { delete pAlias; }
 37};

Indeed SbxVariableRef is defined via macro SV_DECL_REF (see
http://opengrok.libreoffice.org/xref/core/include/tools/ref.hxx#73), here's
some unwinding

SV_DECL_REF
     73 #define SV_DECL_REF( ClassName )                \
     74 class ClassName;                                \
     75 class ClassName##Ref                            \
     76 {                                               \
     77     PRV_SV_DECL_REF( ClassName )                \
     78 };

     70 #define PRV_SV_DECL_REF( ClassName )            \
     71 PRV_SV_DECL_REF_LOCK( ClassName, Ref )   

     53 #define PRV_SV_DECL_REF_LOCK(ClassName, Ref)    \
     54 protected:                                      \
     55     ClassName * pObj;                           \
     56 public:                                         \
     57     inline               ClassName##Ref() { pObj = 0; }                
\
     58     inline               ClassName##Ref( const ClassName##Ref & rObj
); \
     59     inline               ClassName##Ref( ClassName * pObjP );          
\
     60     inline void          Clear();                                      
\
     61     inline               ~ClassName##Ref();                            
\
     62     inline ClassName##Ref & operator = ( const ClassName##Ref & rObj
); \
     63     inline ClassName##Ref & operator = ( ClassName * pObj );           
\
     64     inline sal_Bool        Is() const { return pObj != NULL; }         
\
     65     inline ClassName *     operator &  () const { return pObj; }       
\
     66     inline ClassName *     operator -> () const { return pObj; }       
\
     67     inline ClassName &     operator *  () const { return *pObj; }      
\
     68     inline operator ClassName * () const { return pObj; }

So indeed, there's no virtual destructor, therefore ~SbxVarEntry can't be
called.

SV_DECLR_REF is called a lot of times (see
http://opengrok.libreoffice.org/search?q=SV_DECL_REF&project=core&defs=&refs=&path=&hist=)
so I don't know if "virtual" keyword should just be added to the macro or
should we declare SbxVariableRef without this macro.
I didn't check the other classes which use this macro but it could be mean
other cases (destructor not called) like this.

Any suggestion?

Julien



--
View this message in context: http://nabble.documentfoundation.org/LO-scan-coverity-708945-non-virtual-destructor-in-parent-class-tp4087082.html
Sent from the Dev mailing list archive at Nabble.com.


More information about the LibreOffice mailing list