Cppcheck: throwing exception in destructor in SyncDbusSessionHelper.cxx (shell module)

Stephan Bergmann sbergman at redhat.com
Mon May 13 00:47:35 PDT 2013


On 05/12/2013 04:19 PM, julien2412 wrote:
> Cppcheck reported exception thrown in destructor in
> shell/source/sessioninstall/SyncDbusSessionHelper.cxx, line 39
>       28     class GErrorWrapper
>       29     {
>       30         GError* m_pError;
>       31         public:
>       32             GErrorWrapper(GError* pError) : m_pError(pError) {}
>       33             ~GErrorWrapper()
>       34             {
>       35                 if(!m_pError)
>       36                     return;
>       37                 OUString sMsg =
> OUString::createFromAscii(m_pError->message);
>       38                 g_error_free(m_pError);
>       39                 throw RuntimeException(sMsg, NULL);
>       40             }
>       41             GError** getRef() { return &m_pError; }
>       42     };
>
> Should it be changed? If yes, how? (I suppose we shouldn't just remove it)

So this uses the RAII idiom to ensure one does not forget to call 
g_error_free, and consequently mis-uses the idiom to also throw from a 
dtor a RuntimeException synthesized from the GError.

In principle, this could be safe, if it can be proven that no stack 
unwinding out of the scope of a GErorrWrapper instance can happen. 
However, already the first use in lcl_GetPackageKitProxy shows that this 
is too error prone---the "throw RuntimeException if !proxy" is covered 
by the GErrorWrapper instance's scope, so this will likely lead to abort.

So the best is probably to replace RAII GErrorWrapper with something 
"less clever" that doesn't require throwing from a dtor.

Stephan


More information about the LibreOffice mailing list