From bea8a0193034ba63ec22c14fc118f16da600ab40 Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 9 Aug 2023 12:57:13 +0200 Subject: [PATCH 01/10] clang_tidy.cmake: added `run-clang-tidy-18` 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 ec86c11c169..34f0bb422e1 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' target generation") endif() else() - set(RUN_CLANG_TIDY_NAMES run-clang-tidy 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-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 0e7a1cc1f219b75214958c95e98c01e80c87e70d Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 1 Aug 2023 17:23:36 +0200 Subject: [PATCH 02/10] updated CI to Clang 18 --- .github/workflows/asan.yml | 6 +++--- .github/workflows/clang-tidy.yml | 10 +++++----- .github/workflows/iwyu.yml | 10 +++++----- .github/workflows/tsan.yml | 6 +++--- .github/workflows/ubsan.yml | 6 +++--- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/asan.yml b/.github/workflows/asan.yml index a1210b9b94e..19a3c802736 100644 --- a/.github/workflows/asan.yml +++ b/.github/workflows/asan.yml @@ -49,7 +49,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 17 + sudo ./llvm.sh 18 - name: Install Qt ${{ env.QT_VERSION }} if: false @@ -70,8 +70,8 @@ jobs: run: | cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=Off -DWITH_QCHART=Off -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=Off -DDISABLE_DMAKE=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache env: - CC: clang-17 - CXX: clang++-17 + CC: clang-18 + CXX: clang++-18 - name: Build cppcheck run: | diff --git a/.github/workflows/clang-tidy.yml b/.github/workflows/clang-tidy.yml index 59d40952009..90d04acd10f 100644 --- a/.github/workflows/clang-tidy.yml +++ b/.github/workflows/clang-tidy.yml @@ -37,8 +37,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 17 - sudo apt-get install -y clang-tidy-17 + sudo ./llvm.sh 18 + sudo apt-get install -y clang-tidy-18 - name: Install Qt ${{ env.QT_VERSION }} uses: jurplel/install-qt-action@v3 @@ -49,14 +49,14 @@ jobs: - name: Verify clang-tidy configuration run: | - clang-tidy-17 --verify-config + clang-tidy-18 --verify-config - name: Prepare CMake run: | cmake -S . -B cmake.output -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DUSE_QT6=On -DWITH_QCHART=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DCPPCHK_GLIBCXX_DEBUG=Off env: - CC: clang-17 - CXX: clang++-17 + CC: clang-18 + CXX: clang++-18 - name: Prepare CMake dependencies run: | diff --git a/.github/workflows/iwyu.yml b/.github/workflows/iwyu.yml index f52895e6f48..ac672d70d7e 100644 --- a/.github/workflows/iwyu.yml +++ b/.github/workflows/iwyu.yml @@ -128,8 +128,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 17 - sudo apt-get install -y clang-tools-17 + sudo ./llvm.sh 18 + sudo apt-get install -y clang-tools-18 - name: Install Qt ${{ env.QT_VERSION }} uses: jurplel/install-qt-action@v3 @@ -142,8 +142,8 @@ jobs: run: | cmake -S . -B cmake.output -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=On -DBUILD_TESTS=On -DBUILD_GUI=On -DWITH_QCHART=On -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCPPCHK_GLIBCXX_DEBUG=Off -DUSE_MATCHCOMPILER=Off -DEXTERNALS_AS_SYSTEM=On env: - CC: clang-17 - CXX: clang++-17 + CC: clang-18 + CXX: clang++-18 - name: Prepare CMake dependencies run: | @@ -160,7 +160,7 @@ jobs: - name: clang-include-cleaner run: | # TODO: run multi-threaded - find $PWD/cli $PWD/lib $PWD/test -maxdepth 1 -name "*.cpp" | xargs -t -n 1 clang-include-cleaner-17 --print=changes --extra-arg=-w -p cmake.output > clang-include-cleaner.log 2>&1 + find $PWD/cli $PWD/lib $PWD/test -maxdepth 1 -name "*.cpp" | xargs -t -n 1 clang-include-cleaner-18 --print=changes --extra-arg=-w -p cmake.output > clang-include-cleaner.log 2>&1 - uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/tsan.yml b/.github/workflows/tsan.yml index 949fd7b7552..19cb99bf78f 100644 --- a/.github/workflows/tsan.yml +++ b/.github/workflows/tsan.yml @@ -49,7 +49,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 17 + sudo ./llvm.sh 18 - name: Install Qt ${{ env.QT_VERSION }} if: false @@ -69,8 +69,8 @@ jobs: run: | cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=Off -DWITH_QCHART=Off -DUSE_MATCHCOMPILER=Verify -DANALYZE_THREAD=On -DUSE_THREADS=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 -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache env: - CC: clang-17 - CXX: clang++-17 + CC: clang-18 + CXX: clang++-18 - name: Build cppcheck run: | diff --git a/.github/workflows/ubsan.yml b/.github/workflows/ubsan.yml index 8dbae3238da..ef22f9a2ba2 100644 --- a/.github/workflows/ubsan.yml +++ b/.github/workflows/ubsan.yml @@ -49,7 +49,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 17 + sudo ./llvm.sh 18 - name: Install Qt ${{ env.QT_VERSION }} uses: jurplel/install-qt-action@v3 @@ -69,8 +69,8 @@ jobs: run: | cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=ON -DWITH_QCHART=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 -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache env: - CC: clang-17 - CXX: clang++-17 + CC: clang-18 + CXX: clang++-18 - name: Build cppcheck run: | From 747e7c64ea502d33269f629bae6793ea0fb752e0 Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 9 Aug 2023 14:29:24 +0200 Subject: [PATCH 03/10] disabled clang-tidy check `performance-enum-size` for now --- .clang-tidy | 1 + clang-tidy.md | 1 + 2 files changed, 2 insertions(+) diff --git a/.clang-tidy b/.clang-tidy index b0f8a59348f..1cb728699b8 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -52,6 +52,7 @@ Checks: > -modernize-use-nodiscard, -modernize-use-trailing-return-type, -performance-avoid-endl, + -performance-enum-size, -performance-inefficient-string-concatenation, -performance-no-automatic-move, -performance-noexcept-swap, diff --git a/clang-tidy.md b/clang-tidy.md index a1abd9a5f5c..e81bbbd6c11 100644 --- a/clang-tidy.md +++ b/clang-tidy.md @@ -129,6 +129,7 @@ We run this separately via `clang-include-cleaner` in the `iwyu.yml` workflow as `performance-noexcept-swap`
`bugprone-switch-missing-default-case`
`bugprone-empty-catch`
+`performance-enum-size`
To be evaluated (need to remove exclusion). From 2f8cb6abb5a15c03c3c41aa1a0274e115a0eb7c0 Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 9 Aug 2023 15:20:42 +0200 Subject: [PATCH 04/10] stacktrace.cpp: mitigated `bugprone-multi-level-implicit-pointer-conversion` clang-tidy warning --- cli/stacktrace.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/stacktrace.cpp b/cli/stacktrace.cpp index d58045e308b..40a350d28fc 100644 --- a/cli/stacktrace.cpp +++ b/cli/stacktrace.cpp @@ -85,6 +85,7 @@ void print_stacktrace(FILE* output, bool demangling, int maxdepth, bool lowMem) (int)(firstBracketAddress-symbolString), symbolString); } } + // NOLINTNEXTLINE(bugprone-multi-level-implicit-pointer-conversion) - code matches the documented usage free(symbolStringList); } else { fputs("Callstack could not be obtained\n", output); From 96efaedc03e111b6e6a835d7e2017b51e4b3bdb2 Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 22 Nov 2023 21:33:51 +0100 Subject: [PATCH 05/10] compilerDefinitions.cmake: enable new (and most extensive) hardening mode with `libc++` see https://github.com/llvm/llvm-project/blob/main/libcxx/docs/Hardening.rst --- cmake/compilerDefinitions.cmake | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cmake/compilerDefinitions.cmake b/cmake/compilerDefinitions.cmake index 7369554e91d..8ff3ba1d432 100644 --- a/cmake/compilerDefinitions.cmake +++ b/cmake/compilerDefinitions.cmake @@ -10,11 +10,17 @@ if (MSVC) add_definitions(-D_WIN64) endif() -# TODO: this should probably apply to the compiler and not the platform +# TODO: this should probably apply to the compiler and not the platform - I think it is only "broken" with MinGW +# TODO: AppleClang only has libc++ +# TODO: what about clang-cl and native Win32 clang? if (CPPCHK_GLIBCXX_DEBUG AND UNIX AND CMAKE_BUILD_TYPE STREQUAL "Debug") if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") if (USE_LIBCXX) - add_definitions(-D_LIBCPP_ENABLE_ASSERTIONS=1) + if (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 18 OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 18) + add_definitions(-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG) + else() + add_definitions(-D_LIBCPP_ENABLE_ASSERTIONS=1) + endif() # TODO: also add _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS? endif() else() From e3d00f9368e2508fc12484ccdac6b9be358c1bfb Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 27 Nov 2023 20:16:12 +0100 Subject: [PATCH 06/10] re-enabled `modernize-use-nullptr` clang-tidy check as `-Wzero-as-null-pointer-constant` as adjusted for clang 18 and no longer detects the same cases --- .clang-tidy | 1 - clang-tidy.md | 4 ---- 2 files changed, 5 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 1cb728699b8..de0ece234ec 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -39,7 +39,6 @@ Checks: > -misc-use-anonymous-namespace, -modernize-avoid-c-arrays, -modernize-deprecated-ios-base-aliases, - -modernize-use-nullptr, -misc-include-cleaner, -misc-unused-using-decls, -modernize-loop-convert, diff --git a/clang-tidy.md b/clang-tidy.md index e81bbbd6c11..5fd552188a0 100644 --- a/clang-tidy.md +++ b/clang-tidy.md @@ -186,10 +186,6 @@ It does not seem to produce any warnings for us (needs to be investigated) and i This is the most expensive check for several files and it is providing much in terms of code quality. Reported upstream as https://github.com/llvm/llvm-project/issues/72300. -`modernize-use-nullptr` - -This is already covered by the `-Wzero-as-null-pointer-constant` compiler warning so there is no need for an additional check. - ### Disabled for GUI only `readability-convert-member-functions-to-static`
From b071d1e163d09ffbb4e085a12a6061587b4bae0d Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 11 Dec 2023 15:32:02 +0100 Subject: [PATCH 07/10] compileroptions.cmake: disabled `-Wswitch-default` Clang warning --- cmake/compileroptions.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/compileroptions.cmake b/cmake/compileroptions.cmake index e0a4011ca36..960016d43e3 100644 --- a/cmake/compileroptions.cmake +++ b/cmake/compileroptions.cmake @@ -107,6 +107,7 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options_safe(-Wno-date-time) add_compile_options(-Wno-disabled-macro-expansion) add_compile_options_safe(-Wno-bitwise-instead-of-logical) + add_compile_options_safe(-Wno-switch-default) # these cannot be fixed properly without adopting later C++ standards add_compile_options_safe(-Wno-unsafe-buffer-usage) From f669b9473cb3e9caf1b7bba935b1bdf183a2a8a6 Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 17 Jan 2024 12:56:49 +0100 Subject: [PATCH 08/10] fixed `readability-avoid-return-with-void-value` clang-tidy warnings --- lib/symboldatabase.h | 2 +- lib/valueflow.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index e1ef8d0051c..5d9234bd237 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -1003,7 +1003,7 @@ class CPPCHECKLIB Function { setFlag(fIsVolatile, state); } void hasTrailingReturnType(bool state) { - return setFlag(fHasTrailingReturnType, state); + setFlag(fHasTrailingReturnType, state); } void isInlineKeyword(bool state) { setFlag(fIsInlineKeyword, state); diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index b7865d78b1c..e425095d28c 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -6302,7 +6302,7 @@ struct ConditionHandler { const Settings& settings, SourceLocation loc = SourceLocation::current()) const { - return valueFlowReverse(start, endToken, exprTok, values, tokenlist, errorLogger, settings, loc); + valueFlowReverse(start, endToken, exprTok, values, tokenlist, errorLogger, settings, loc); } void traverseCondition(const TokenList& tokenlist, From 9f2997380a7148e3df4fea7c3a5adc0595ce5f03 Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 17 Jan 2024 13:00:41 +0100 Subject: [PATCH 09/10] disabled `readability-avoid-nested-conditional-operator` clang-tidy check for now --- .clang-tidy | 1 + clang-tidy.md | 1 + 2 files changed, 2 insertions(+) diff --git a/.clang-tidy b/.clang-tidy index de0ece234ec..0b130f31de0 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -58,6 +58,7 @@ Checks: > -portability-simd-intrinsics, -portability-std-allocator-const, -readability-avoid-const-params-in-decls, + -readability-avoid-nested-conditional-operator, -readability-braces-around-statements, -readability-container-data-pointer, -readability-function-cognitive-complexity, diff --git a/clang-tidy.md b/clang-tidy.md index 5fd552188a0..108af31a354 100644 --- a/clang-tidy.md +++ b/clang-tidy.md @@ -130,6 +130,7 @@ We run this separately via `clang-include-cleaner` in the `iwyu.yml` workflow as `bugprone-switch-missing-default-case`
`bugprone-empty-catch`
`performance-enum-size`
+`readability-avoid-nested-conditional-operator`
To be evaluated (need to remove exclusion). From 82206587f9cb605517831fff5a4af87092d6b912 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 22 Jan 2024 12:16:45 +0100 Subject: [PATCH 10/10] fixed `readability-redundant-casting` clang-tidy warnings --- lib/clangimport.cpp | 2 +- lib/symboldatabase.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index ea44d5e6699..0f83af6d697 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -1466,7 +1466,7 @@ void clangimport::AstNode::createTokensForCXXRecord(TokenList &tokenList) const_cast(classToken->scope())->definedTypesMap[className] = scope->definedType; } addtoken(tokenList, ";"); - const_cast(tokenList.back())->scope(classToken->scope()); + tokenList.back()->scope(classToken->scope()); } Token * clangimport::AstNode::createTokensVarDecl(TokenList &tokenList) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index a454d5c0951..474f6ef45bb 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1196,7 +1196,7 @@ void SymbolDatabase::fixVarId(VarIdMap & varIds, const Token * vartok, Token * m if (varId == varIds.end()) { MemberIdMap memberId; if (membertok->varId() == 0) { - memberId[membervar->nameToken()->varId()] = const_cast(mTokenizer).newVarId(); + memberId[membervar->nameToken()->varId()] = mTokenizer.newVarId(); mVariableList.push_back(membervar); } else mVariableList[membertok->varId()] = membervar; @@ -1206,7 +1206,7 @@ void SymbolDatabase::fixVarId(VarIdMap & varIds, const Token * vartok, Token * m MemberIdMap::iterator memberId = varId->second.find(membervar->nameToken()->varId()); if (memberId == varId->second.end()) { if (membertok->varId() == 0) { - varId->second.insert(std::make_pair(membervar->nameToken()->varId(), const_cast(mTokenizer).newVarId())); + varId->second.insert(std::make_pair(membervar->nameToken()->varId(), mTokenizer.newVarId())); mVariableList.push_back(membervar); memberId = varId->second.find(membervar->nameToken()->varId()); } else @@ -1766,7 +1766,7 @@ void SymbolDatabase::createSymbolDatabaseExprIds() // Mark expressions that are unique std::vector> uniqueExprId(id); - for (Token* tok = const_cast(mTokenizer.list.front()); tok; tok = tok->next()) { + for (Token* tok = mTokenizer.list.front(); tok; tok = tok->next()) { const auto id2 = tok->exprId(); if (id2 == 0 || id2 <= maximumVarId) continue; @@ -2982,7 +2982,7 @@ bool Function::argsMatch(const Scope *scope, const Token *first, const Token *se if (Token::simpleMatch(second->next(), param.c_str(), param.size())) { // check for redundant qualification before skipping it if (!Token::simpleMatch(first->next(), param.c_str(), param.size())) { - second = second->tokAt(int(arg_path_length)); + second = second->tokAt(arg_path_length); arg_path_length = 0; } } @@ -7263,7 +7263,7 @@ static const Function* getFunction(const Token* tok) { void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *tokens) { if (!tokens) - tokens = const_cast(mTokenizer).list.front(); + tokens = mTokenizer.list.front(); for (Token *tok = tokens; tok; tok = tok->next()) tok->setValueType(nullptr);