[Development] Qt API review with clazy
Sergio Martins
sergio.martins at kdab.com
Sat Sep 10 17:29:15 CEST 2016
Hi,
I've been developing a Qt oriented clang compiler plugin called clazy [1].
It has about 50 custom checks/warnings for common Qt and C++ mistakes.
I would like to propose clazy to be used to sanitize API of new Qt modules. Of
course, only a few of the 50 checks are relevant to API, so I will only talk
about those.
** Checks that can find bugs **
* clazy-copyable-polymorphic
polymorphic copyable classes are usually vulnerable to slicing [2]
The cases I found were either real bugs or easily fixable by adding
Q_DISABLE_COPY.
* clazy-rule-of-two-soft
Finds when you're calling the compiler generated copy-ctor of a class that has
a user-defined assign operator (and vice-versa).
You'll want to write both, or none. I've found many bugs where one of them was
missing (where the copy-ctor didn't have the same behavior as the assign-
operator).
In most cases you can simply remove the user defined methods and let the
compiler generate them.
* clazy-rule-of-three
Either implement all 3 dtor, copy-ctor and assign-op or none of them.
This is my favorite as it finds many bugs which are easy to fix.
It's very common to have a class that is holding a resource and frees it in
the DTOR, but if that class gets copied then two DTORs might run, freeing the
resource twice, which might crash or misbehave the app.
See for example https://codereview.qt-project.org/#/c/151488/ , QBasicTimer is
copyable, but when a copy is destroyed it stops both timers.
Also common is copying a class that has a d-pointer and getting a crash when
both DTORs are run because you forgot the copy-ctor and assign-op.
So either implement the copy-ctor and assign-op too, or use Q_DISABLE_COPY, or
in the majority of cases, just remove your DTOR if it doesn't do any work.
* mutable-container-key
QMap or QHash having a key that can be modified by external factors (like
QPointer)
** Nice to haves (don't find real bugs but are related to performance) **
* clazy-function-args-by-ref
Pass big or non-trivial types (so copy-ctor and dtor don't get called) by
const-ref
* clazy-missing-typeinfo
Types used in containers but missing a Q_DECLARE_TYPEINFO
* clazy-qenums:
Use Q_ENUM instead of Q_ENUMS
* clazy-missing-qobject-macro
missing a Q_OBJECT macro
** Debatable **
* clazy-function-args-by-value
Pass small and trivial types by value
Thanks for reading.
[1] https://github.com/KDE/clazy
[2] https://en.wikipedia.org/wiki/Object_slicing
Regards,
--
SĂ©rgio Martins | sergio.martins at kdab.com | Senior Software Engineer
Klarälvdalens Datakonsult AB, a KDAB Group company
Tel: Sweden (HQ) +46-563-540090, USA +1-866-777-KDAB(5322)
KDAB - The Qt Experts
More information about the Development
mailing list