From d609bd1ab1a5e42ae79a1e6f3044c464b0e820fd Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 30 Mar 2025 03:35:47 +0200 Subject: [PATCH 1/8] Fix clang-tidy header filter --- .clang-tidy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.clang-tidy b/.clang-tidy index d630063315..567cc0b689 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -15,4 +15,4 @@ WarningsAsErrors: > -clang-analyzer-optin*, -clang-analyzer-cplusplus.NewDeleteLeaks, -clang-analyzer-core.CallAndMessage -HeaderFilterRegex: '^(apps|components)' +HeaderFilterRegex: '(apps|components)/' From da388c93eb5f1d0fdf17b3b5654ab6d429397d6b Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 30 Mar 2025 01:48:41 +0100 Subject: [PATCH 2/8] Remove boost-* clang-tidy checks There are only: * https://clang.llvm.org/extra/clang-tidy/checks/boost/use-ranges.html * https://clang.llvm.org/extra/clang-tidy/checks/boost/use-to-string.html None of them makes sense in this project. --- .clang-tidy | 2 -- 1 file changed, 2 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 567cc0b689..f4dc9cabc5 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,6 +1,5 @@ Checks: > -*, - boost-*, portability-*, clang-analyzer-*, -clang-analyzer-optin*, @@ -9,7 +8,6 @@ Checks: > -modernize-avoid-bind WarningsAsErrors: > -*, - boost-*, portability-*, clang-analyzer-*, -clang-analyzer-optin*, From 7c45a564a1e9791b418d2eec24e93d530028adfc Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 30 Mar 2025 12:32:27 +0200 Subject: [PATCH 3/8] Fix clang-analyzer-deadcode.DeadStores --- .../detournavigator/navmeshtilescache.cpp | 2 +- apps/benchmarks/esm/benchrefid.cpp | 20 ++++++++-------- apps/benchmarks/settings/access.cpp | 24 +++++++++---------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/apps/benchmarks/detournavigator/navmeshtilescache.cpp b/apps/benchmarks/detournavigator/navmeshtilescache.cpp index 26873d9a03..eabd757796 100644 --- a/apps/benchmarks/detournavigator/navmeshtilescache.cpp +++ b/apps/benchmarks/detournavigator/navmeshtilescache.cpp @@ -179,7 +179,7 @@ namespace generateKeys(std::back_inserter(keys), keys.size() * (100 - hitPercentage) / 100, random); std::size_t n = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { const auto& key = keys[n++ % keys.size()]; auto result = cache.get(key.mAgentBounds, key.mTilePosition, key.mRecastMesh); diff --git a/apps/benchmarks/esm/benchrefid.cpp b/apps/benchmarks/esm/benchrefid.cpp index b12f494ab9..3f38177ca7 100644 --- a/apps/benchmarks/esm/benchrefid.cpp +++ b/apps/benchmarks/esm/benchrefid.cpp @@ -104,7 +104,7 @@ namespace std::minstd_rand random; std::vector refIds = generateStringRefIds(state.range(0), random); std::size_t i = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(refIds[i].serialize()); if (++i >= refIds.size()) @@ -118,7 +118,7 @@ namespace std::vector serializedRefIds = generateSerializedStringRefIds(state.range(0), random, [](ESM::RefId v) { return v.serialize(); }); std::size_t i = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(ESM::RefId::deserialize(serializedRefIds[i])); if (++i >= serializedRefIds.size()) @@ -131,7 +131,7 @@ namespace std::minstd_rand random; std::vector refIds = generateStringRefIds(state.range(0), random); std::size_t i = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(refIds[i].serializeText()); if (++i >= refIds.size()) @@ -145,7 +145,7 @@ namespace std::vector serializedRefIds = generateSerializedStringRefIds(state.range(0), random, [](ESM::RefId v) { return v.serializeText(); }); std::size_t i = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(ESM::RefId::deserializeText(serializedRefIds[i])); if (++i >= serializedRefIds.size()) @@ -158,7 +158,7 @@ namespace std::minstd_rand random; std::vector refIds = generateGeneratedRefIds(random); std::size_t i = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(refIds[i].serializeText()); if (++i >= refIds.size()) @@ -172,7 +172,7 @@ namespace std::vector serializedRefIds = generateSerializedGeneratedRefIds(random, [](ESM::RefId v) { return v.serializeText(); }); std::size_t i = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(ESM::RefId::deserializeText(serializedRefIds[i])); if (++i >= serializedRefIds.size()) @@ -185,7 +185,7 @@ namespace std::minstd_rand random; std::vector refIds = generateIndexRefIds(random); std::size_t i = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(refIds[i].serializeText()); if (++i >= refIds.size()) @@ -199,7 +199,7 @@ namespace std::vector serializedRefIds = generateSerializedIndexRefIds(random, [](ESM::RefId v) { return v.serializeText(); }); std::size_t i = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(ESM::RefId::deserializeText(serializedRefIds[i])); if (++i >= serializedRefIds.size()) @@ -212,7 +212,7 @@ namespace std::minstd_rand random; std::vector refIds = generateESM3ExteriorCellRefIds(random); std::size_t i = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(refIds[i].serializeText()); if (++i >= refIds.size()) @@ -226,7 +226,7 @@ namespace std::vector serializedRefIds = generateSerializedESM3ExteriorCellRefIds(random, [](ESM::RefId v) { return v.serializeText(); }); std::size_t i = 0; - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(ESM::RefId::deserializeText(serializedRefIds[i])); if (++i >= serializedRefIds.size()) diff --git a/apps/benchmarks/settings/access.cpp b/apps/benchmarks/settings/access.cpp index 7660d0d55e..9e6999dd1f 100644 --- a/apps/benchmarks/settings/access.cpp +++ b/apps/benchmarks/settings/access.cpp @@ -9,7 +9,7 @@ namespace { void settingsManager(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(Settings::Manager::getFloat("sky blending start", "Fog")); } @@ -17,7 +17,7 @@ namespace void settingsManager2(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(Settings::Manager::getFloat("near clip", "Camera")); benchmark::DoNotOptimize(Settings::Manager::getBool("transparent postpass", "Post Processing")); @@ -26,7 +26,7 @@ namespace void settingsManager3(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(Settings::Manager::getFloat("near clip", "Camera")); benchmark::DoNotOptimize(Settings::Manager::getBool("transparent postpass", "Post Processing")); @@ -36,7 +36,7 @@ namespace void localStatic(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { static float v = Settings::Manager::getFloat("sky blending start", "Fog"); benchmark::DoNotOptimize(v); @@ -45,7 +45,7 @@ namespace void localStatic2(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { static float v1 = Settings::Manager::getFloat("near clip", "Camera"); static bool v2 = Settings::Manager::getBool("transparent postpass", "Post Processing"); @@ -56,7 +56,7 @@ namespace void localStatic3(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { static float v1 = Settings::Manager::getFloat("near clip", "Camera"); static bool v2 = Settings::Manager::getBool("transparent postpass", "Post Processing"); @@ -69,7 +69,7 @@ namespace void settingsStorage(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { float v = Settings::fog().mSkyBlendingStart.get(); benchmark::DoNotOptimize(v); @@ -78,7 +78,7 @@ namespace void settingsStorage2(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { bool v1 = Settings::postProcessing().mTransparentPostpass.get(); float v2 = Settings::camera().mNearClip.get(); @@ -89,7 +89,7 @@ namespace void settingsStorage3(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { bool v1 = Settings::postProcessing().mTransparentPostpass.get(); float v2 = Settings::camera().mNearClip.get(); @@ -102,7 +102,7 @@ namespace void settingsStorageGet(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(Settings::get("Fog", "sky blending start")); } @@ -110,7 +110,7 @@ namespace void settingsStorageGet2(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(Settings::get("Post Processing", "transparent postpass")); benchmark::DoNotOptimize(Settings::get("Camera", "near clip")); @@ -119,7 +119,7 @@ namespace void settingsStorageGet3(benchmark::State& state) { - for (auto _ : state) + for ([[maybe_unused]] auto _ : state) { benchmark::DoNotOptimize(Settings::get("Post Processing", "transparent postpass")); benchmark::DoNotOptimize(Settings::get("Camera", "near clip")); From e098770ba26322d37f9f00a53da53deaedc164f2 Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 30 Mar 2025 18:13:31 +0200 Subject: [PATCH 4/8] Use custom clang-tidy config for extern/ --- extern/.clang-tidy | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 extern/.clang-tidy diff --git a/extern/.clang-tidy b/extern/.clang-tidy new file mode 100644 index 0000000000..bc766e0a9e --- /dev/null +++ b/extern/.clang-tidy @@ -0,0 +1,3 @@ +Checks: >- + -clang-analyzer-core.NullDereference, + -clang-analyzer-cplusplus.NewDelete From c34b0f90d7ef543c4b4efb66384852605b395236 Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 30 Mar 2025 19:55:41 +0200 Subject: [PATCH 5/8] Avoid clang-tidy checks duplication --- .clang-tidy | 8 +------- CI/before_script.linux.sh | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index f4dc9cabc5..026d78fa12 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -6,11 +6,5 @@ Checks: > -clang-analyzer-cplusplus.NewDeleteLeaks, -clang-analyzer-core.CallAndMessage, -modernize-avoid-bind -WarningsAsErrors: > - -*, - portability-*, - clang-analyzer-*, - -clang-analyzer-optin*, - -clang-analyzer-cplusplus.NewDeleteLeaks, - -clang-analyzer-core.CallAndMessage +WarningsAsErrors: '*' HeaderFilterRegex: '(apps|components)/' diff --git a/CI/before_script.linux.sh b/CI/before_script.linux.sh index 2589c2807e..c6fd306e25 100755 --- a/CI/before_script.linux.sh +++ b/CI/before_script.linux.sh @@ -38,7 +38,7 @@ fi if [[ $CI_CLANG_TIDY ]]; then CMAKE_CONF_OPTS+=( - -DCMAKE_CXX_CLANG_TIDY="clang-tidy;--warnings-as-errors=*" + -DCMAKE_CXX_CLANG_TIDY=clang-tidy -DBUILD_COMPONENTS_TESTS=ON -DBUILD_OPENMW_TESTS=ON -DBUILD_OPENCS_TESTS=ON From 621a0a15a395af89c99440adeebb9590432aef16 Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 30 Mar 2025 23:17:42 +0200 Subject: [PATCH 6/8] Disable clang-analyzer-cplusplus.NewDelete clang-tidy check --- .clang-tidy | 1 + 1 file changed, 1 insertion(+) diff --git a/.clang-tidy b/.clang-tidy index 026d78fa12..231a26f6e6 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -4,6 +4,7 @@ Checks: > clang-analyzer-*, -clang-analyzer-optin*, -clang-analyzer-cplusplus.NewDeleteLeaks, + -clang-analyzer-cplusplus.NewDelete, -clang-analyzer-core.CallAndMessage, -modernize-avoid-bind WarningsAsErrors: '*' From 3af2091b28984f0886f4284167ac423c935ea51e Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 30 Mar 2025 23:18:09 +0200 Subject: [PATCH 7/8] Use prefix with dot for clang-analyzer-optin. checks --- .clang-tidy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.clang-tidy b/.clang-tidy index 231a26f6e6..855e550ac5 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -2,7 +2,7 @@ Checks: > -*, portability-*, clang-analyzer-*, - -clang-analyzer-optin*, + -clang-analyzer-optin.*, -clang-analyzer-cplusplus.NewDeleteLeaks, -clang-analyzer-cplusplus.NewDelete, -clang-analyzer-core.CallAndMessage, From 7254bb74a49b58a630f4682dcca813025cd63d00 Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 30 Mar 2025 23:23:34 +0200 Subject: [PATCH 8/8] Enable modernize-avoid-bind clang-tidy check --- .clang-tidy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.clang-tidy b/.clang-tidy index 855e550ac5..e70de76c7f 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -6,6 +6,6 @@ Checks: > -clang-analyzer-cplusplus.NewDeleteLeaks, -clang-analyzer-cplusplus.NewDelete, -clang-analyzer-core.CallAndMessage, - -modernize-avoid-bind + modernize-avoid-bind WarningsAsErrors: '*' HeaderFilterRegex: '(apps|components)/'