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