File indexing completed on 2024-04-14 05:32:05

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