File indexing completed on 2024-04-28 16:57:49
0001 /* 0002 This file is part of the clazy static checker. 0003 0004 Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com 0005 Author: Sérgio Martins <sergio.martins@kdab.com> 0006 0007 This library is free software; you can redistribute it and/or 0008 modify it under the terms of the GNU Library General Public 0009 License as published by the Free Software Foundation; either 0010 version 2 of the License, or (at your option) any later version. 0011 0012 This library is distributed in the hope that it will be useful, 0013 but WITHOUT ANY WARRANTY; without even the implied warranty of 0014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0015 Library General Public License for more details. 0016 0017 You should have received a copy of the GNU Library General Public License 0018 along with this library; see the file COPYING.LIB. If not, write to 0019 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0020 Boston, MA 02110-1301, USA. 0021 */ 0022 0023 0024 /** 0025 * To add a new check you can either edit this file, or use the python script: 0026 * dev-scripts/generate.py > src/Checks.h 0027 */ 0028 0029 #include "checkmanager.h" 0030 #include "checks/manuallevel/assert-with-side-effects.h" 0031 #include "checks/manuallevel/container-inside-loop.h" 0032 #include "checks/manuallevel/detaching-member.h" 0033 #include "checks/manuallevel/heap-allocated-small-trivial-type.h" 0034 #include "checks/manuallevel/ifndef-define-typo.h" 0035 #include "checks/manuallevel/isempty-vs-count.h" 0036 #include "checks/manuallevel/jnisignatures.h" 0037 #include "checks/manuallevel/qhash-with-char-pointer-key.h" 0038 #include "checks/manuallevel/qproperty-type-mismatch.h" 0039 #include "checks/manuallevel/qrequiredresult-candidates.h" 0040 #include "checks/manuallevel/qstring-varargs.h" 0041 #include "checks/manuallevel/qt-keywords.h" 0042 #include "checks/manuallevel/qt4-qstring-from-array.h" 0043 #include "checks/manuallevel/qt6-deprecated-api-fixes.h" 0044 #include "checks/manuallevel/qt6-fwd-fixes.h" 0045 #include "checks/manuallevel/qt6-header-fixes.h" 0046 #include "checks/manuallevel/qt6-qhash-signature.h" 0047 #include "checks/manuallevel/qt6-qlatin1stringchar-to-u.h" 0048 #include "checks/manuallevel/qvariant-template-instantiation.h" 0049 #include "checks/manuallevel/raw-environment-function.h" 0050 #include "checks/manuallevel/reserve-candidates.h" 0051 #include "checks/manuallevel/signal-with-return-value.h" 0052 #include "checks/manuallevel/thread-with-slots.h" 0053 #include "checks/manuallevel/tr-non-literal.h" 0054 #include "checks/manuallevel/unexpected-flag-enumerator-value.h" 0055 #include "checks/manuallevel/unneeded-cast.h" 0056 #include "checks/manuallevel/use-arrow-operator-instead-of-data.h" 0057 #include "checks/manuallevel/use-chrono-in-qtimer.h" 0058 #include "checks/level0/connect-by-name.h" 0059 #include "checks/level0/connect-non-signal.h" 0060 #include "checks/level0/connect-not-normalized.h" 0061 #include "checks/level0/container-anti-pattern.h" 0062 #include "checks/level0/empty-qstringliteral.h" 0063 #include "checks/level0/fully-qualified-moc-types.h" 0064 #include "checks/level0/lambda-in-connect.h" 0065 #include "checks/level0/lambda-unique-connection.h" 0066 #include "checks/level0/lowercase-qml-type-name.h" 0067 #include "checks/level0/mutable-container-key.h" 0068 #include "checks/level0/overloaded-signal.h" 0069 #include "checks/level0/qcolor-from-literal.h" 0070 #include "checks/level0/qdatetime-utc.h" 0071 #include "checks/level0/qenums.h" 0072 #include "checks/level0/qfileinfo-exists.h" 0073 #include "checks/level0/qgetenv.h" 0074 #include "checks/level0/qmap-with-pointer-key.h" 0075 #include "checks/level0/qstring-arg.h" 0076 #include "checks/level0/qstring-comparison-to-implicit-char.h" 0077 #include "checks/level0/qstring-insensitive-allocation.h" 0078 #include "checks/level0/qstring-ref.h" 0079 #include "checks/level0/qt-macros.h" 0080 #include "checks/level0/strict-iterators.h" 0081 #include "checks/level0/temporary-iterator.h" 0082 #include "checks/level0/unused-non-trivial-variable.h" 0083 #include "checks/level0/use-static-qregularexpression.h" 0084 #include "checks/level0/writing-to-temporary.h" 0085 #include "checks/level0/wrong-qevent-cast.h" 0086 #include "checks/level0/wrong-qglobalstatic.h" 0087 #include "checks/level1/auto-unexpected-qstringbuilder.h" 0088 #include "checks/level1/child-event-qobject-cast.h" 0089 #include "checks/level1/connect-3arg-lambda.h" 0090 #include "checks/level1/const-signal-or-slot.h" 0091 #include "checks/level1/detaching-temporary.h" 0092 #include "checks/level1/foreach.h" 0093 #include "checks/level1/incorrect-emit.h" 0094 #include "checks/level1/install-event-filter.h" 0095 #include "checks/level1/non-pod-global-static.h" 0096 #include "checks/level1/overridden-signal.h" 0097 #include "checks/level1/post-event.h" 0098 #include "checks/level1/qdeleteall.h" 0099 #include "checks/level1/qhash-namespace.h" 0100 #include "checks/level1/qlatin1string-non-ascii.h" 0101 #include "checks/level1/qproperty-without-notify.h" 0102 #include "checks/level1/qstring-left.h" 0103 #include "checks/level1/range-loop-detach.h" 0104 #include "checks/level1/range-loop-reference.h" 0105 #include "checks/level1/returning-data-from-temporary.h" 0106 #include "checks/level1/rule-of-two-soft.h" 0107 #include "checks/level1/skipped-base-method.h" 0108 #include "checks/level1/virtual-signal.h" 0109 #include "checks/level2/base-class-event.h" 0110 #include "checks/level2/copyable-polymorphic.h" 0111 #include "checks/level2/ctor-missing-parent-argument.h" 0112 #include "checks/level2/function-args-by-ref.h" 0113 #include "checks/level2/function-args-by-value.h" 0114 #include "checks/level2/global-const-char-pointer.h" 0115 #include "checks/level2/implicit-casts.h" 0116 #include "checks/level2/missing-qobject-macro.h" 0117 #include "checks/level2/missing-typeinfo.h" 0118 #include "checks/level2/old-style-connect.h" 0119 #include "checks/level2/qstring-allocations.h" 0120 #include "checks/level2/returning-void-expression.h" 0121 #include "checks/level2/rule-of-three.h" 0122 #include "checks/level2/static-pmf.h" 0123 #include "checks/level2/virtual-call-ctor.h" 0124 0125 template <typename T> 0126 RegisteredCheck check(const char *name, CheckLevel level, RegisteredCheck::Options options = RegisteredCheck::Option_None) 0127 { 0128 auto factoryFuntion = [name](ClazyContext *context){ return new T(name, context); }; 0129 return RegisteredCheck{name, level, factoryFuntion, options}; 0130 } 0131 0132 void CheckManager::registerChecks() 0133 { 0134 registerCheck(check<AssertWithSideEffects>("assert-with-side-effects", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0135 registerCheck(check<ContainerInsideLoop>("container-inside-loop", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0136 registerCheck(check<DetachingMember>("detaching-member", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0137 registerCheck(check<HeapAllocatedSmallTrivialType>("heap-allocated-small-trivial-type", ManualCheckLevel, RegisteredCheck::Option_VisitsDecls)); 0138 registerCheck(check<IfndefDefineTypo>("ifndef-define-typo", ManualCheckLevel, RegisteredCheck::Option_None)); 0139 registerCheck(check<IsEmptyVSCount>("isempty-vs-count", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0140 registerCheck(check<JniSignatures>("jni-signatures", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0141 registerCheck(check<QHashWithCharPointerKey>("qhash-with-char-pointer-key", ManualCheckLevel, RegisteredCheck::Option_VisitsDecls)); 0142 registerCheck(check<QPropertyTypeMismatch>("qproperty-type-mismatch", ManualCheckLevel, RegisteredCheck::Option_VisitsDecls)); 0143 registerCheck(check<QRequiredResultCandidates>("qrequiredresult-candidates", ManualCheckLevel, RegisteredCheck::Option_VisitsDecls)); 0144 registerCheck(check<QStringVarargs>("qstring-varargs", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0145 registerCheck(check<QtKeywords>("qt-keywords", ManualCheckLevel, RegisteredCheck::Option_None)); 0146 registerFixIt(1, "fix-qt-keywords", "qt-keywords"); 0147 registerCheck(check<Qt4QStringFromArray>("qt4-qstring-from-array", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0148 registerFixIt(1, "fix-qt4-qstring-from-array", "qt4-qstring-from-array"); 0149 registerCheck(check<Qt6DeprecatedAPIFixes>("qt6-deprecated-api-fixes", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts | RegisteredCheck::Option_VisitsDecls)); 0150 registerFixIt(1, "fix-qt6-deprecated-api-fixes", "qt6-deprecated-api-fixes"); 0151 registerCheck(check<Qt6FwdFixes>("qt6-fwd-fixes", ManualCheckLevel, RegisteredCheck::Option_VisitsDecls)); 0152 registerFixIt(1, "fix-qt6-fwd-fixes", "qt6-fwd-fixes"); 0153 registerCheck(check<Qt6HeaderFixes>("qt6-header-fixes", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0154 registerFixIt(1, "fix-qt6-header-fixes", "qt6-header-fixes"); 0155 registerCheck(check<Qt6QHashSignature>("qt6-qhash-signature", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts | RegisteredCheck::Option_VisitsDecls)); 0156 registerFixIt(1, "fix-qt6-qhash-signature", "qt6-qhash-signature"); 0157 registerCheck(check<Qt6QLatin1StringCharToU>("qt6-qlatin1stringchar-to-u", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0158 registerFixIt(1, "fix-qt6-qlatin1stringchar-to-u", "qt6-qlatin1stringchar-to-u"); 0159 registerCheck(check<QVariantTemplateInstantiation>("qvariant-template-instantiation", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0160 registerCheck(check<RawEnvironmentFunction>("raw-environment-function", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0161 registerCheck(check<ReserveCandidates>("reserve-candidates", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0162 registerCheck(check<SignalWithReturnValue>("signal-with-return-value", ManualCheckLevel, RegisteredCheck::Option_VisitsDecls)); 0163 registerCheck(check<ThreadWithSlots>("thread-with-slots", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts | RegisteredCheck::Option_VisitsDecls)); 0164 registerCheck(check<TrNonLiteral>("tr-non-literal", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0165 registerCheck(check<UnexpectedFlagEnumeratorValue>("unexpected-flag-enumerator-value", ManualCheckLevel, RegisteredCheck::Option_VisitsDecls)); 0166 registerCheck(check<UnneededCast>("unneeded-cast", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0167 registerCheck(check<UseArrowOperatorInsteadOfData>("use-arrow-operator-instead-of-data", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0168 registerCheck(check<UseChronoInQTimer>("use-chrono-in-qtimer", ManualCheckLevel, RegisteredCheck::Option_VisitsStmts)); 0169 registerCheck(check<ConnectByName>("connect-by-name", CheckLevel0, RegisteredCheck::Option_VisitsDecls)); 0170 registerCheck(check<ConnectNonSignal>("connect-non-signal", CheckLevel0, RegisteredCheck::Option_Qt4Incompatible | RegisteredCheck::Option_VisitsStmts)); 0171 registerCheck(check<ConnectNotNormalized>("connect-not-normalized", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0172 registerCheck(check<ContainerAntiPattern>("container-anti-pattern", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0173 registerCheck(check<EmptyQStringliteral>("empty-qstringliteral", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0174 registerCheck(check<FullyQualifiedMocTypes>("fully-qualified-moc-types", CheckLevel0, RegisteredCheck::Option_VisitsDecls)); 0175 registerCheck(check<LambdaInConnect>("lambda-in-connect", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0176 registerCheck(check<LambdaUniqueConnection>("lambda-unique-connection", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0177 registerCheck(check<LowercaseQMlTypeName>("lowercase-qml-type-name", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0178 registerCheck(check<MutableContainerKey>("mutable-container-key", CheckLevel0, RegisteredCheck::Option_VisitsDecls)); 0179 registerCheck(check<OverloadedSignal>("overloaded-signal", CheckLevel0, RegisteredCheck::Option_VisitsDecls)); 0180 #ifndef CLAZY_DISABLE_AST_MATCHERS 0181 registerCheck(check<QColorFromLiteral>("qcolor-from-literal", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0182 #endif 0183 registerCheck(check<QDateTimeUtc>("qdatetime-utc", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0184 registerFixIt(1, "fix-qdatetime-utc", "qdatetime-utc"); 0185 registerCheck(check<QEnums>("qenums", CheckLevel0, RegisteredCheck::Option_Qt4Incompatible)); 0186 registerCheck(check<QFileInfoExists>("qfileinfo-exists", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0187 registerCheck(check<QGetEnv>("qgetenv", CheckLevel0, RegisteredCheck::Option_Qt4Incompatible | RegisteredCheck::Option_VisitsStmts)); 0188 registerFixIt(1, "fix-qgetenv", "qgetenv"); 0189 registerCheck(check<QMapWithPointerKey>("qmap-with-pointer-key", CheckLevel0, RegisteredCheck::Option_VisitsDecls)); 0190 registerCheck(check<QStringArg>("qstring-arg", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0191 registerCheck(check<QStringComparisonToImplicitChar>("qstring-comparison-to-implicit-char", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0192 registerCheck(check<QStringInsensitiveAllocation>("qstring-insensitive-allocation", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0193 registerCheck(check<StringRefCandidates>("qstring-ref", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0194 registerFixIt(1, "fix-missing-qstringref", "qstring-ref"); 0195 registerCheck(check<QtMacros>("qt-macros", CheckLevel0, RegisteredCheck::Option_None)); 0196 registerCheck(check<StrictIterators>("strict-iterators", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0197 registerCheck(check<TemporaryIterator>("temporary-iterator", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0198 registerCheck(check<UnusedNonTrivialVariable>("unused-non-trivial-variable", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0199 registerCheck(check<UseStaticQRegularExpression>("use-static-qregularexpression", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0200 registerCheck(check<WritingToTemporary>("writing-to-temporary", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0201 registerCheck(check<WrongQEventCast>("wrong-qevent-cast", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0202 registerCheck(check<WrongQGlobalStatic>("wrong-qglobalstatic", CheckLevel0, RegisteredCheck::Option_VisitsStmts)); 0203 registerCheck(check<AutoUnexpectedQStringBuilder>("auto-unexpected-qstringbuilder", CheckLevel1, RegisteredCheck::Option_VisitsStmts | RegisteredCheck::Option_VisitsDecls)); 0204 registerFixIt(1, "fix-auto-unexpected-qstringbuilder", "auto-unexpected-qstringbuilder"); 0205 registerCheck(check<ChildEventQObjectCast>("child-event-qobject-cast", CheckLevel1, RegisteredCheck::Option_VisitsDecls)); 0206 registerCheck(check<Connect3ArgLambda>("connect-3arg-lambda", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0207 registerCheck(check<ConstSignalOrSlot>("const-signal-or-slot", CheckLevel1, RegisteredCheck::Option_VisitsStmts | RegisteredCheck::Option_VisitsDecls)); 0208 registerCheck(check<DetachingTemporary>("detaching-temporary", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0209 registerCheck(check<Foreach>("foreach", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0210 registerCheck(check<IncorrectEmit>("incorrect-emit", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0211 registerCheck(check<InstallEventFilter>("install-event-filter", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0212 registerCheck(check<NonPodGlobalStatic>("non-pod-global-static", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0213 registerCheck(check<OverriddenSignal>("overridden-signal", CheckLevel1, RegisteredCheck::Option_VisitsDecls)); 0214 registerCheck(check<PostEvent>("post-event", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0215 registerCheck(check<QDeleteAll>("qdeleteall", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0216 registerCheck(check<QHashNamespace>("qhash-namespace", CheckLevel1, RegisteredCheck::Option_VisitsDecls)); 0217 registerCheck(check<QLatin1StringNonAscii>("qlatin1string-non-ascii", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0218 registerCheck(check<QPropertyWithoutNotify>("qproperty-without-notify", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0219 registerCheck(check<QStringLeft>("qstring-left", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0220 registerCheck(check<RangeLoopDetach>("range-loop-detach", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0221 registerFixIt(1, "fix-range-loop-add-qasconst", "range-loop-detach"); 0222 registerCheck(check<RangeLoopReference>("range-loop-reference", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0223 registerFixIt(1, "fix-range-loop-add-ref", "range-loop-reference"); 0224 registerCheck(check<ReturningDataFromTemporary>("returning-data-from-temporary", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0225 registerCheck(check<RuleOfTwoSoft>("rule-of-two-soft", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0226 registerCheck(check<SkippedBaseMethod>("skipped-base-method", CheckLevel1, RegisteredCheck::Option_VisitsStmts)); 0227 registerCheck(check<VirtualSignal>("virtual-signal", CheckLevel1, RegisteredCheck::Option_VisitsDecls)); 0228 registerCheck(check<BaseClassEvent>("base-class-event", CheckLevel2, RegisteredCheck::Option_VisitsDecls)); 0229 registerCheck(check<CopyablePolymorphic>("copyable-polymorphic", CheckLevel2, RegisteredCheck::Option_VisitsDecls)); 0230 registerCheck(check<CtorMissingParentArgument>("ctor-missing-parent-argument", CheckLevel2, RegisteredCheck::Option_VisitsDecls)); 0231 registerCheck(check<FunctionArgsByRef>("function-args-by-ref", CheckLevel2, RegisteredCheck::Option_VisitsStmts | RegisteredCheck::Option_VisitsDecls)); 0232 registerFixIt(1, "fix-function-args-by-ref", "function-args-by-ref"); 0233 registerCheck(check<FunctionArgsByValue>("function-args-by-value", CheckLevel2, RegisteredCheck::Option_VisitsStmts | RegisteredCheck::Option_VisitsDecls)); 0234 registerCheck(check<GlobalConstCharPointer>("global-const-char-pointer", CheckLevel2, RegisteredCheck::Option_VisitsDecls)); 0235 registerCheck(check<ImplicitCasts>("implicit-casts", CheckLevel2, RegisteredCheck::Option_VisitsStmts)); 0236 registerCheck(check<MissingQObjectMacro>("missing-qobject-macro", CheckLevel2, RegisteredCheck::Option_VisitsDecls)); 0237 registerFixIt(1, "fix-missing-qobject-macro", "missing-qobject-macro"); 0238 registerCheck(check<MissingTypeInfo>("missing-typeinfo", CheckLevel2, RegisteredCheck::Option_VisitsDecls)); 0239 registerCheck(check<OldStyleConnect>("old-style-connect", CheckLevel2, RegisteredCheck::Option_Qt4Incompatible | RegisteredCheck::Option_VisitsStmts)); 0240 registerFixIt(1, "fix-old-style-connect", "old-style-connect"); 0241 registerCheck(check<QStringAllocations>("qstring-allocations", CheckLevel2, RegisteredCheck::Option_Qt4Incompatible | RegisteredCheck::Option_VisitsStmts)); 0242 registerFixIt(1, "fix-qlatin1string-allocations", "qstring-allocations"); 0243 registerFixIt(2, "fix-fromLatin1_fromUtf8-allocations", "qstring-allocations"); 0244 registerFixIt(4, "fix-fromCharPtrAllocations", "qstring-allocations"); 0245 registerCheck(check<ReturningVoidExpression>("returning-void-expression", CheckLevel2, RegisteredCheck::Option_VisitsStmts)); 0246 registerCheck(check<RuleOfThree>("rule-of-three", CheckLevel2, RegisteredCheck::Option_VisitsDecls)); 0247 registerCheck(check<StaticPmf>("static-pmf", CheckLevel2, RegisteredCheck::Option_VisitsDecls)); 0248 registerCheck(check<VirtualCallCtor>("virtual-call-ctor", CheckLevel2, RegisteredCheck::Option_VisitsDecls)); 0249 }