From e349acd42b11a7a7a8ef215afd4a8b950e26e280 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 7 Aug 2025 13:13:43 +0200 Subject: [PATCH 01/12] clang_tidy.cmake: added `run-clang-tidy-22` to binaries to look for --- cmake/clang_tidy.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/clang_tidy.cmake b/cmake/clang_tidy.cmake index e9a9148c6fe..6476be5ad04 100644 --- a/cmake/clang_tidy.cmake +++ b/cmake/clang_tidy.cmake @@ -11,7 +11,7 @@ if(NOT CMAKE_DISABLE_PRECOMPILE_HEADERS) message(STATUS "Cannot use non-Clang compiler with clang-tidy when precompiled headers are enabled - skipping 'run-clang-tidy'/'run-clang-tidy-csa' target generation") endif() else() - set(RUN_CLANG_TIDY_NAMES run-clang-tidy run-clang-tidy-21 run-clang-tidy-20 run-clang-tidy-19 run-clang-tidy-18 run-clang-tidy-17 run-clang-tidy-16 run-clang-tidy-15 run-clang-tidy-14 run-clang-tidy-13 run-clang-tidy-12 run-clang-tidy-11 run-clang-tidy-10 run-clang-tidy-9 run-clang-tidy-8) + set(RUN_CLANG_TIDY_NAMES run-clang-tidy run-clang-tidy-22 run-clang-tidy-21 run-clang-tidy-20 run-clang-tidy-19 run-clang-tidy-18 run-clang-tidy-17 run-clang-tidy-16 run-clang-tidy-15 run-clang-tidy-14 run-clang-tidy-13 run-clang-tidy-12 run-clang-tidy-11 run-clang-tidy-10 run-clang-tidy-9 run-clang-tidy-8) endif() if(RUN_CLANG_TIDY_NAMES) From d8776f34f5c38976a50c7f398fb117eb67c0e950 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 7 Aug 2025 13:14:47 +0200 Subject: [PATCH 02/12] updated CI to Clang 22 --- .github/workflows/asan.yml | 6 +++--- .github/workflows/clang-tidy.yml | 10 +++++----- .github/workflows/iwyu.yml | 12 ++++++------ .github/workflows/tsan.yml | 6 +++--- .github/workflows/ubsan.yml | 6 +++--- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/asan.yml b/.github/workflows/asan.yml index 70b3a30f0ae..642dbfd151c 100644 --- a/.github/workflows/asan.yml +++ b/.github/workflows/asan.yml @@ -54,7 +54,7 @@ jobs: sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14 wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 21 + sudo ./llvm.sh 22 - name: Install Qt ${{ env.QT_VERSION }} uses: jurplel/install-qt-action@v4 @@ -76,8 +76,8 @@ jobs: run: | cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify -DANALYZE_ADDRESS=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache env: - CC: clang-21 - CXX: clang++-21 + CC: clang-22 + CXX: clang++-22 - name: Build cppcheck run: | diff --git a/.github/workflows/clang-tidy.yml b/.github/workflows/clang-tidy.yml index 7b2c4f4e2c7..5d7445f34b5 100644 --- a/.github/workflows/clang-tidy.yml +++ b/.github/workflows/clang-tidy.yml @@ -43,8 +43,8 @@ jobs: sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14 wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 21 - sudo apt-get install -y clang-tidy-21 + sudo ./llvm.sh 22 + sudo apt-get install -y clang-tidy-22 - name: Install Qt ${{ env.QT_VERSION }} uses: jurplel/install-qt-action@v4 @@ -57,14 +57,14 @@ jobs: - name: Verify clang-tidy configuration run: | - clang-tidy-21 --verify-config + clang-tidy-22 --verify-config - name: Prepare CMake run: | cmake -S . -B cmake.output -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCPPCHK_GLIBCXX_DEBUG=Off -DWARNINGS_ARE_ERRORS=On env: - CC: clang-21 - CXX: clang++-21 + CC: clang-22 + CXX: clang++-22 - name: Prepare CMake dependencies run: | diff --git a/.github/workflows/iwyu.yml b/.github/workflows/iwyu.yml index 649991f9373..772a0da320c 100644 --- a/.github/workflows/iwyu.yml +++ b/.github/workflows/iwyu.yml @@ -214,13 +214,13 @@ jobs: sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14 wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 21 - sudo apt-get install -y clang-tools-21 + sudo ./llvm.sh 22 + sudo apt-get install -y clang-tools-22 - name: Install libc++ if: matrix.stdlib == 'libc++' run: | - sudo apt-get install -y libc++-21-dev + sudo apt-get install -y libc++-22-dev - name: Install Qt ${{ env.QT_VERSION }} uses: jurplel/install-qt-action@v4 @@ -235,8 +235,8 @@ jobs: run: | cmake -S . -B cmake.output -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On -DUSE_LIBCXX=${{ matrix.use_libcxx }} env: - CC: clang-21 - CXX: clang++-21 + CC: clang-22 + CXX: clang++-22 - name: Prepare CMake dependencies run: | @@ -253,7 +253,7 @@ jobs: - name: clang-include-cleaner run: | # TODO: run multi-threaded - find $PWD/cli $PWD/lib $PWD/test $PWD/gui -maxdepth 1 -name "*.cpp" | xargs -t -n 1 clang-include-cleaner-21 --print=changes --extra-arg=-w --extra-arg=-stdlib=${{ matrix.stdlib }} -p cmake.output > clang-include-cleaner.log 2>&1 + find $PWD/cli $PWD/lib $PWD/test $PWD/gui -maxdepth 1 -name "*.cpp" | xargs -t -n 1 clang-include-cleaner-22 --print=changes --extra-arg=-w --extra-arg=-stdlib=${{ matrix.stdlib }} -p cmake.output > clang-include-cleaner.log 2>&1 - uses: actions/upload-artifact@v4 if: success() || failure() diff --git a/.github/workflows/tsan.yml b/.github/workflows/tsan.yml index 27ed6606386..cd1fad16751 100644 --- a/.github/workflows/tsan.yml +++ b/.github/workflows/tsan.yml @@ -53,7 +53,7 @@ jobs: sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14 wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 21 + sudo ./llvm.sh 22 - name: Install Qt ${{ env.QT_VERSION }} uses: jurplel/install-qt-action@v4 @@ -75,8 +75,8 @@ jobs: run: | cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify -DANALYZE_THREAD=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=Off -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache env: - CC: clang-21 - CXX: clang++-21 + CC: clang-22 + CXX: clang++-22 - name: Build cppcheck run: | diff --git a/.github/workflows/ubsan.yml b/.github/workflows/ubsan.yml index 64eb02a4b25..ecfe0f05379 100644 --- a/.github/workflows/ubsan.yml +++ b/.github/workflows/ubsan.yml @@ -53,7 +53,7 @@ jobs: sudo apt-get purge --auto-remove llvm python3-lldb-14 llvm-14 wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 21 + sudo ./llvm.sh 22 - name: Install Qt ${{ env.QT_VERSION }} uses: jurplel/install-qt-action@v4 @@ -75,8 +75,8 @@ jobs: run: | cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_TRIAGE=On -DUSE_MATCHCOMPILER=Verify -DANALYZE_UNDEFINED=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_COMPILE_WARNING_AS_ERROR=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache env: - CC: clang-21 - CXX: clang++-21 + CC: clang-22 + CXX: clang++-22 - name: Build cppcheck run: | From d0d362e66595f0c115dc563892e030a3ec802c98 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 7 Aug 2025 13:27:00 +0200 Subject: [PATCH 03/12] cmake/clang_tidy.cmake: added `-enable-check-profile` / removed outdated comment --- cmake/clang_tidy.cmake | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cmake/clang_tidy.cmake b/cmake/clang_tidy.cmake index 6476be5ad04..fe0efbbe32f 100644 --- a/cmake/clang_tidy.cmake +++ b/cmake/clang_tidy.cmake @@ -25,6 +25,9 @@ if(RUN_CLANG_TIDY_NAMES) endif() message(STATUS "NPROC=${NPROC}") + # TODO: introduced in run-clang-tidy-22 + set(CLANG_TIDY_CONFIG "-enable-check-profile") + # most of these are disabled because they are too noisy in our code # clang-analyzer-core.CallAndMessage # clang-analyzer-core.NonNullParamChecker @@ -41,13 +44,12 @@ if(RUN_CLANG_TIDY_NAMES) # TODO: exclude moc_*.cpp # TODO: exclude mocs_compilation.cpp - # disable all compiler warnings since we are just interested in the tidy ones add_custom_target(run-clang-tidy - ${Python_EXECUTABLE} ${RUN_CLANG_TIDY} -p=${CMAKE_BINARY_DIR} -j ${NPROC} -quiet + ${Python_EXECUTABLE} ${RUN_CLANG_TIDY} -p=${CMAKE_BINARY_DIR} -j ${NPROC} -quiet ${CLANG_TIDY_CONFIG} USES_TERMINAL VERBATIM) add_custom_target(run-clang-tidy-csa - ${Python_EXECUTABLE} ${RUN_CLANG_TIDY} -p=${CMAKE_BINARY_DIR} -j ${NPROC} -quiet ${CLANG_TIDY_CSA_ALPHA_OPTS} ${CLANG_TIDY_CSA_CONFIG} + ${Python_EXECUTABLE} ${RUN_CLANG_TIDY} -p=${CMAKE_BINARY_DIR} -j ${NPROC} -quiet ${CLANG_TIDY_CONFIG} ${CLANG_TIDY_CSA_ALPHA_OPTS} ${CLANG_TIDY_CSA_CONFIG} USES_TERMINAL VERBATIM) if(BUILD_GUI) From 0298ebcbead9773325e1d96ba5d0eba3ed3745ea Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 27 Aug 2025 11:54:12 +0200 Subject: [PATCH 04/12] .clang-tidy: disabled `misc-unconventional-assign-operator` for now --- .clang-tidy | 3 ++- clang-tidy.md | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.clang-tidy b/.clang-tidy index e1032aaa5f3..83cf17e69a8 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -71,7 +71,8 @@ Checks: > -readability-magic-numbers, -readability-suspicious-call-argument, -readability-uppercase-literal-suffix, - -readability-use-concise-preprocessor-directives + -readability-use-concise-preprocessor-directives, + -misc-unconventional-assign-operator WarningsAsErrors: '*' HeaderFilterRegex: '(cli|gui|frontend|lib|oss-fuzz|test|triage)\/[a-z_]+\.h' ExcludeHeaderFilterRegex: 'ui_.*.h' diff --git a/clang-tidy.md b/clang-tidy.md index 72df0375ca1..e1e9c568512 100644 --- a/clang-tidy.md +++ b/clang-tidy.md @@ -130,6 +130,7 @@ Does not improve the readability. `modernize-use-designated-initializers`
`readability-enum-initial-value`
`modernize-use-trailing-return-type`
+`misc-unconventional-assign-operator`
To be evaluated (need to remove exclusion). From a79465404b3046101fac762e49cc6caa92b6b2b0 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 8 Sep 2025 13:13:45 +0200 Subject: [PATCH 05/12] .clang-tidy: limit `misc-override-with-different-visibility` warnings to `widening` --- .clang-tidy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.clang-tidy b/.clang-tidy index 83cf17e69a8..fde41238546 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -83,3 +83,5 @@ CheckOptions: value: '0' - key: modernize-use-trailing-return-type.TransformFunctions value: false + - key: misc-override-with-different-visibility.DisallowedVisibilityChange + value: widening From 0cadc2757dc6a10162039b093a42bbdd1d5f48c7 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 8 Sep 2025 13:27:37 +0200 Subject: [PATCH 06/12] fixed `misc-override-with-different-visibility` clang-tidy warnings --- gui/checkthread.h | 12 ++++++------ gui/resultstree.h | 4 ++-- gui/translationhandler.h | 2 +- lib/vf_analyzers.cpp | 2 ++ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/gui/checkthread.h b/gui/checkthread.h index 892bdf5258d..4247a45094c 100644 --- a/gui/checkthread.h +++ b/gui/checkthread.h @@ -78,12 +78,6 @@ class CheckThread : public QThread { mSuppressionsUi = s; } - /** - * @brief method that is run in a thread - * - */ - void run() override; - void stop(); /** @@ -137,6 +131,12 @@ class CheckThread : public QThread { std::shared_ptr mSuppressions; private: + /** + * @brief method that is run in a thread + * + */ + void run() override; + void runAddonsAndTools(const Settings& settings, const FileSettings *fileSettings, const QString &fileName); void parseClangErrors(const QString &tool, const QString &file0, QString err); diff --git a/gui/resultstree.h b/gui/resultstree.h index efa759cd6d1..a2b07788f56 100644 --- a/gui/resultstree.h +++ b/gui/resultstree.h @@ -202,8 +202,6 @@ class ResultsTree : public QTreeView { */ ShowTypes mShowSeverities; - void keyPressEvent(QKeyEvent *event) override; - void setReportType(ReportType reportType); /** @@ -557,6 +555,8 @@ protected slots: bool mVisibleErrors{}; private: + void keyPressEvent(QKeyEvent *event) override; + /** tag selected items */ void tagSelectedItems(const QString &tag); diff --git a/gui/translationhandler.h b/gui/translationhandler.h index 0b2988f583e..8ab5b46b6f7 100644 --- a/gui/translationhandler.h +++ b/gui/translationhandler.h @@ -59,7 +59,7 @@ struct TranslationInfo { * track which translation is the currently active translation. * */ -class TranslationHandler : QObject { +class TranslationHandler : public QObject { Q_OBJECT public: explicit TranslationHandler(QObject *parent = nullptr); diff --git a/lib/vf_analyzers.cpp b/lib/vf_analyzers.cpp index 5f5568663e4..e14af7a9c98 100644 --- a/lib/vf_analyzers.cpp +++ b/lib/vf_analyzers.cpp @@ -1233,6 +1233,7 @@ struct SingleValueFlowAnalyzer : ValueFlowAnalyzer { return false; } +private: ValuePtr reanalyze(Token* tok, const std::string& msg) const override { ValueFlow::Value newValue = value; newValue.errorPath.emplace_back(tok, msg); @@ -1431,6 +1432,7 @@ struct SubExpressionAnalyzer : ExpressionAnalyzer { partialReads->emplace_back(tok, v); } +private: // No reanalysis for subexpression ValuePtr reanalyze(Token* /*tok*/, const std::string& /*msg*/) const override { return {}; From 4ffb5fac495ac8e503d3eae4934939c50da673bf Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 30 Sep 2025 18:32:21 +0200 Subject: [PATCH 07/12] .clang-tidy: disabled `bugprone-throwing-static-initialization` clang-tidy warnings for now --- .clang-tidy | 1 + clang-tidy.md | 1 + 2 files changed, 2 insertions(+) diff --git a/.clang-tidy b/.clang-tidy index fde41238546..90bf7e7a304 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -30,6 +30,7 @@ Checks: > -bugprone-narrowing-conversions, -bugprone-signed-char-misuse, -bugprone-switch-missing-default-case, + -bugprone-throwing-static-initialization, -bugprone-unchecked-optional-access, -clang-analyzer-*, -concurrency-mt-unsafe, diff --git a/clang-tidy.md b/clang-tidy.md index e1e9c568512..846ffbee5f7 100644 --- a/clang-tidy.md +++ b/clang-tidy.md @@ -131,6 +131,7 @@ Does not improve the readability. `readability-enum-initial-value`
`modernize-use-trailing-return-type`
`misc-unconventional-assign-operator`
+`bugprone-throwing-static-initialization`
To be evaluated (need to remove exclusion). From db70839c59d5c0afd3ed2331ee42ffa354037deb Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 30 Sep 2025 18:34:44 +0200 Subject: [PATCH 08/12] mitigated `readability-redundant-parentheses` clang-tidy warnings --- cli/signalhandler.cpp | 4 ++-- lib/checkautovariables.cpp | 2 +- lib/checkclass.cpp | 4 ++-- lib/checkcondition.cpp | 16 ++++++++-------- lib/checkio.cpp | 2 +- lib/checkmemoryleak.cpp | 2 +- lib/checkother.cpp | 4 ++-- lib/checkuninitvar.cpp | 2 +- lib/symboldatabase.cpp | 2 +- lib/templatesimplifier.cpp | 4 ++-- lib/tokenize.cpp | 4 ++-- lib/valueflow.cpp | 4 ++-- 12 files changed, 25 insertions(+), 25 deletions(-) diff --git a/cli/signalhandler.cpp b/cli/signalhandler.cpp index 4f84f036c7e..d09bbd349d0 100644 --- a/cli/signalhandler.cpp +++ b/cli/signalhandler.cpp @@ -238,7 +238,7 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context) } fprintf(output, " (at 0x%lx).%s\n", reinterpret_cast(info->si_addr), - (isAddressOnStack)?" Stackoverflow?":""); + isAddressOnStack ? " Stackoverflow?" : ""); break; case SIGINT: unexpectedSignal=false; // legal usage: interrupt application via CTRL-C @@ -264,7 +264,7 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context) (type==-1)? "" : (type==0) ? "reading " : "writing ", reinterpret_cast(info->si_addr), - (isAddressOnStack)?" Stackoverflow?":"" + isAddressOnStack ? " Stackoverflow?" : "" ); break; case SIGUSR1: diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index ab0ad0505b0..bc18c3dc477 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -308,7 +308,7 @@ void CheckAutoVariables::autoVariables() for (const ValueFlow::Value &v : tok->values()) { if (v.isImpossible()) continue; - if ((v.isTokValue() && (isArrayVar(v.tokvalue) || ((v.tokvalue->tokType() == Token::eString)))) || + if ((v.isTokValue() && (isArrayVar(v.tokvalue) || (v.tokvalue->tokType() == Token::eString))) || (v.isLocalLifetimeValue() && v.lifetimeKind == ValueFlow::Value::LifetimeKind::Address && !Token::simpleMatch(v.tokvalue, "("))) { errorInvalidDeallocation(tok, &v); break; diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index d8f7d16fbaf..1248bb5fa13 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -3188,9 +3188,9 @@ enum class CtorType : std::uint8_t { void CheckClass::checkCopyCtorAndEqOperator() { - // This is disabled because of #8388 + // TODO: This is disabled because of #8388 // The message must be clarified. How is the behaviour different? - if ((true) || !mSettings->severity.isEnabled(Severity::warning)) // NOLINT(readability-simplify-boolean-expr) + if ((true) || !mSettings->severity.isEnabled(Severity::warning)) // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses) return; // logChecker diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 5f35f443cbf..dd797e19112 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -1059,7 +1059,7 @@ static bool parseComparison(const Token *comp, bool ¬1, std::string &op, std: { not1 = false; while (comp && comp->str() == "!") { - not1 = !(not1); + not1 = !not1; comp = comp->astOperand1(); } @@ -1096,7 +1096,7 @@ static bool parseComparison(const Token *comp, bool ¬1, std::string &op, std: expr = comp; } - inconclusive = inconclusive || ((value)[0] == '\'' && !(op == "!=" || op == "==")); + inconclusive = inconclusive || (value[0] == '\'' && !(op == "!=" || op == "==")); // Only float and int values are currently handled return MathLib::isInt(value) || MathLib::isFloat(value) || (value[0] == '\''); @@ -1288,13 +1288,13 @@ void CheckCondition::checkIncorrectLogicOperator() continue; // the expr are not the token of the value but they provide better context - const double d1 = (isfloat) ? MathLib::toDoubleNumber(value1) : 0; - const double d2 = (isfloat) ? MathLib::toDoubleNumber(value2) : 0; - const MathLib::bigint i1 = (isfloat) ? 0 : MathLib::toBigNumber(value1, expr1); - const MathLib::bigint i2 = (isfloat) ? 0 : MathLib::toBigNumber(value2, expr2); + const double d1 = isfloat ? MathLib::toDoubleNumber(value1) : 0; + const double d2 = isfloat ? MathLib::toDoubleNumber(value2) : 0; + const MathLib::bigint i1 = isfloat ? 0 : MathLib::toBigNumber(value1, expr1); + const MathLib::bigint i2 = isfloat ? 0 : MathLib::toBigNumber(value2, expr2); const bool useUnsignedInt = (std::numeric_limits::max()==i1) || (std::numeric_limits::max()==i2); - const MathLib::biguint u1 = (useUnsignedInt) ? MathLib::toBigUNumber(value1, expr1) : 0; - const MathLib::biguint u2 = (useUnsignedInt) ? MathLib::toBigUNumber(value2, expr2) : 0; + const MathLib::biguint u1 = useUnsignedInt ? MathLib::toBigUNumber(value1, expr1) : 0; + const MathLib::biguint u2 = useUnsignedInt ? MathLib::toBigUNumber(value2, expr2) : 0; // evaluate if expression is always true/false bool alwaysTrue = true, alwaysFalse = true; bool firstTrue = true, secondTrue = true; diff --git a/lib/checkio.cpp b/lib/checkio.cpp index 3662adfda8f..a250e044c9f 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -1681,7 +1681,7 @@ bool CheckIO::ArgumentInfo::isArrayOrPointer() const bool CheckIO::ArgumentInfo::isComplexType() const { if (variableInfo->type()) - return (true); + return true; const Token* varTypeTok = typeToken; if (varTypeTok->str() == "std") diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index bd9d1bc892f..ac6329bcf86 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -454,7 +454,7 @@ void CheckMemoryLeakInFunction::checkReallocUsage() continue; const AllocType allocType = getReallocationType(reallocTok, tok->varId()); - if (!((allocType == Malloc || allocType == OtherMem))) + if (!(allocType == Malloc || allocType == OtherMem)) continue; const Token* arg = getArguments(reallocTok).at(f->reallocArg - 1); while (arg && arg->isCast()) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 1247d97365e..2786f5442a6 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -1468,8 +1468,8 @@ void CheckOther::variableScopeError(const Token *tok, const std::string &varname //--------------------------------------------------------------------------- void CheckOther::checkCommaSeparatedReturn() { - // This is experimental for now. See #5076 - if ((true) || !mSettings->severity.isEnabled(Severity::style)) // NOLINT(readability-simplify-boolean-expr) + // TODO: This is experimental for now. See #5076 + if ((true) || !mSettings->severity.isEnabled(Severity::style)) // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses) return; // logChecker diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index dccce6ad348..8463f6a1c8e 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1540,7 +1540,7 @@ bool CheckUninitVar::isMemberVariableUsage(const Token *tok, bool isPointer, All return true; // TODO: this used to be experimental - enable or remove see #5586 - if ((false) && // NOLINT(readability-simplify-boolean-expr) + if ((false) && // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses) !isPointer && Token::Match(tok->tokAt(-2), "[(,] & %name% [,)]") && isVariableUsage(tok, isPointer, alloc)) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index b6528d9a9e6..1c77a365a1b 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1946,7 +1946,7 @@ bool SymbolDatabase::isFunction(const Token *tok, const Scope* outerScope, const // function returning function pointer? '... ( ... %name% ( ... ))( ... ) {' // function returning reference to array '... ( & %name% ( ... ))[ ... ] {' // TODO: Activate this again - if ((false) && tok->str() == "(" && tok->strAt(1) != "*" && // NOLINT(readability-simplify-boolean-expr) + if ((false) && tok->str() == "(" && tok->strAt(1) != "*" && // NOLINT(readability-simplify-boolean-expr,readability-redundant-parentheses) (tok->link()->strAt(-1) == ")" || Token::simpleMatch(tok->link()->tokAt(-2), ") const"))) { const Token* tok2 = tok->link()->next(); if (tok2 && tok2->str() == "(" && Token::Match(tok2->link()->next(), "{|;|const|=")) { diff --git a/lib/templatesimplifier.cpp b/lib/templatesimplifier.cpp index e7a096932cf..26a21ec91ad 100644 --- a/lib/templatesimplifier.cpp +++ b/lib/templatesimplifier.cpp @@ -2859,9 +2859,9 @@ bool TemplateSimplifier::simplifyCalculations(Token* frontToken, const Token *ba } else if ((((Token::Match(tok->previous(), "[=[(,] 0 * %name%|%num% ,|]|)|;|=|%cop%") || Token::Match(tok->previous(), "return|case 0 *|&& %name%|%num% ,|:|;|=|%cop%")) && validTokenEnd(bounded, tok, backToken, 3)) || - (((Token::Match(tok->previous(), "[=[(,] 0 * (") || + ((Token::Match(tok->previous(), "[=[(,] 0 * (") || Token::Match(tok->previous(), "return|case 0 *|&& (")) && - validTokenEnd(bounded, tok, backToken, 2))))) { + validTokenEnd(bounded, tok, backToken, 2)))) { tok->deleteNext(); if (tok->strAt(1) == "(") eraseTokens(tok, tok->linkAt(1)); diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 8c324a72701..e9bd2a84267 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -195,7 +195,7 @@ bool Tokenizer::duplicateTypedef(Token *&tokPtr, const Token *name, const Token if (end->strAt(1) == "(") end = end->linkAt(1); - end = (end)?end->next():nullptr; + end = end ? end->next() : nullptr; } if (end) end = end->next(); @@ -631,7 +631,7 @@ namespace { } } // TODO: handle all typedefs - if ((false)) + if ((false)) // NOLINT(readability-redundant-parentheses) printTypedef(typedefToken, std::cout); mFail = true; } diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 023d2ebde31..8847e3f7ab0 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -2495,8 +2495,8 @@ static void valueFlowLifetimeFunction(Token *tok, const TokenList &tokenlist, Er std::vector args = getArguments(tok); const std::size_t n = args.size(); if (n > 1 && Token::typeStr(args[n - 2]) == Token::typeStr(args[n - 1]) && - (((astIsIterator(args[n - 2]) && astIsIterator(args[n - 1])) || - (astIsPointer(args[n - 2]) && astIsPointer(args[n - 1]))))) { + ((astIsIterator(args[n - 2]) && astIsIterator(args[n - 1])) || + (astIsPointer(args[n - 2]) && astIsPointer(args[n - 1])))) { LifetimeStore{ args.back(), "Added to container '" + memtok->str() + "'.", ValueFlow::Value::LifetimeKind::Object} .byDerefCopy(memtok, tokenlist, errorLogger, settings); From 086c942e3d2ba3fad9c756130bf169eb7f2b3581 Mon Sep 17 00:00:00 2001 From: firewave Date: Sun, 19 Oct 2025 20:49:28 +0200 Subject: [PATCH 09/12] disabled `bugprone-command-processor` clang-tidy warning --- .clang-tidy | 1 + clang-tidy.md | 1 + 2 files changed, 2 insertions(+) diff --git a/.clang-tidy b/.clang-tidy index 90bf7e7a304..6c12ecbbc6b 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -24,6 +24,7 @@ Checks: > google-explicit-constructor, -bugprone-assignment-in-if-condition, -bugprone-branch-clone, + -bugprone-command-processor, -bugprone-easily-swappable-parameters, -bugprone-empty-catch, -bugprone-macro-parentheses, diff --git a/clang-tidy.md b/clang-tidy.md index 846ffbee5f7..5ff3622fc31 100644 --- a/clang-tidy.md +++ b/clang-tidy.md @@ -132,6 +132,7 @@ Does not improve the readability. `modernize-use-trailing-return-type`
`misc-unconventional-assign-operator`
`bugprone-throwing-static-initialization`
+`bugprone-command-processor`
To be evaluated (need to remove exclusion). From 38837d087e777d8a80d17db58f333f678035c5c1 Mon Sep 17 00:00:00 2001 From: firewave Date: Sun, 19 Oct 2025 20:50:17 +0200 Subject: [PATCH 10/12] disabled `cert-err34-c` in favor of `bugprone-unchecked-string-to-number-conversion` alias --- .clang-tidy | 1 - lib/checkbufferoverrun.cpp | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 6c12ecbbc6b..4f1232bcc52 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -18,7 +18,6 @@ Checks: > -objc-*, -openmp-*, -zircon-*, - cert-err34-c, cppcoreguidelines-pro-type-static-cast-downcast, cppcoreguidelines-rvalue-reference-param-not-moved, google-explicit-constructor, diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 57c46492bc0..b052fd52b51 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -156,14 +156,14 @@ static int getMinFormatStringOutputLength(const std::vector ¶m outputStringSize++; if (handleNextParameter) { - // NOLINTNEXTLINE(cert-err34-c) - intentional use + // NOLINTNEXTLINE(bugprone-unchecked-string-to-number-conversion) - intentional use int tempDigits = std::abs(std::atoi(digits_string.c_str())); if (i_d_x_f_found) tempDigits = std::max(tempDigits, 1); if (digits_string.find('.') != std::string::npos) { const std::string endStr = digits_string.substr(digits_string.find('.') + 1); - // NOLINTNEXTLINE(cert-err34-c) - intentional use + // NOLINTNEXTLINE(bugprone-unchecked-string-to-number-conversion) - intentional use const int maxLen = std::max(std::abs(std::atoi(endStr.c_str())), 1); if (formatString[i] == 's') { From 7454f71c72717e0b5204ed17fb69b13a10746009 Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 30 Dec 2025 17:43:52 +0100 Subject: [PATCH 11/12] codeeditor.h: suppress `bugprone-derived-method-shadowing-base-method` for now --- gui/codeeditor.h | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/codeeditor.h b/gui/codeeditor.h index 9508c562c41..1ba8b3fd84d 100644 --- a/gui/codeeditor.h +++ b/gui/codeeditor.h @@ -119,6 +119,7 @@ class CodeEditor : public QPlainTextEdit { return mFileName; } + // NOLINTNEXTLINE(bugprone-derived-method-shadowing-base-method) - TODO: fix this void clear() { mFileName.clear(); setPlainText(QString()); From cb38ff411bd5a1587a917f82b4062a435017cd59 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 12 Jan 2026 02:32:11 +0100 Subject: [PATCH 12/12] disabled `readability-redundant-parentheses` for now --- .clang-tidy | 1 + clang-tidy.md | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/.clang-tidy b/.clang-tidy index 4f1232bcc52..8c30f2c602b 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -70,6 +70,7 @@ Checks: > -readability-implicit-bool-conversion, -readability-isolate-declaration, -readability-magic-numbers, + -readability-redundant-parentheses, -readability-suspicious-call-argument, -readability-uppercase-literal-suffix, -readability-use-concise-preprocessor-directives, diff --git a/clang-tidy.md b/clang-tidy.md index 5ff3622fc31..aae6918e372 100644 --- a/clang-tidy.md +++ b/clang-tidy.md @@ -159,6 +159,10 @@ These apply to codebases which use later standards then C++11 (C++17 is used whe We are not interested in this. +`readability-redundant-parentheses`
+ +Reports false positives - see https://github.com/llvm/llvm-project/issues/164125. + ### Disabled for performance reasons `portability-std-allocator-const`