Files
Alexey MilovidovandClaude Opus 4.7 21fdf4d2ed Disable cppcoreguidelines-* aliases for checks in other modules
The previous `Make cppcoreguidelines-* exclusion explicit in .clang-tidy`
commit replaced the wildcard `-cppcoreguidelines-*` with an explicit list
of disables, but the explicit list missed clang-tidy aliases whose
canonical names live in other modules (`modernize-*`, `readability-*`,
`bugprone-*`, `misc-*`, `performance-*`).

Without the wildcard, those aliases became enabled (because their
underlying canonical checks are enabled), and CI started rejecting code
under names like `cppcoreguidelines-avoid-magic-numbers`,
`cppcoreguidelines-avoid-c-arrays`, and
`cppcoreguidelines-narrowing-conversions`.

Add explicit disables for all 11 known `cppcoreguidelines-*` aliases so
the original suppression behaviour is preserved while the explicit list
remains a complete, audit-friendly mapping of every check in this group.

CI report:
https://s3.amazonaws.com/clickhouse-test-reports/PRs/100399/07f475b6a1bff91d197fac08e8178911fb38ce93/build_arm_tidy/build_clickhouse/build_clickhouse.log.zst

PR: https://github.com/ClickHouse/ClickHouse/pull/100399

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-06 10:32:39 +00:00

228 lines
10 KiB
YAML

# To run clang-tidy from CMake, build ClickHouse with -DENABLE_CLANG_TIDY=1. To show all warnings, it is
# recommended to pass "-k0" to Ninja.
# Enable all checks + disable selected checks. Feel free to remove disabled checks from below list if
# a) the new check is not controversial (this includes many checks in readability-* and google-*) or
# b) too noisy (checks with > 100 new warnings are considered noisy, this includes e.g. cppcoreguidelines-*).
HeaderFilterRegex: '^.*/(base|src|programs|utils)/.*(h|hpp)$'
# We don't want to use clang-tidy diagnostics in the "contrib" folder.
ExcludeHeaderFilterRegex: '^.*/contrib/.*'
Checks: [
'*',
'-abseil-string-find-str-contains', # disabled to avoid a misleading suggestion (obsolete absl::StrContains() instead of C++23 std::string::contains())
'-altera-*',
'-android-*',
'-boost-use-ranges',
'-bugprone-assignment-in-if-condition',
'-bugprone-branch-clone',
'-bugprone-easily-swappable-parameters',
'-bugprone-exception-escape',
'-bugprone-implicit-widening-of-multiplication-result',
'-bugprone-multi-level-implicit-pointer-conversion',
'-bugprone-narrowing-conversions',
'-bugprone-unchecked-optional-access',
'-bugprone-crtp-constructor-accessibility',
'-bugprone-not-null-terminated-result',
'-bugprone-forward-declaration-namespace',
'-bugprone-nondeterministic-pointer-iteration-order',
'-bugprone-sizeof-expression', # too aggressive
'-cert-dcl16-c',
'-cert-arr39-c', # alias of bugprone-sizeof-expression
'-cert-err58-cpp',
'-clang-analyzer-core.BitwiseShift', # false positive on boost::dynamic_bitset::to_ulong
'-clang-analyzer-optin.performance.Padding',
'-clang-analyzer-security.ArrayBound', # only false positives
'-clang-analyzer-cplusplus.NewDeleteLeaks', # false positives, slow
'-clang-analyzer-unix.Malloc', # fixme, false positive in contrib somehow
# cppcoreguidelines-* checks are mostly impractical in a codebase as large as ClickHouse, also slow.
# Listed explicitly (instead of wildcard '-cppcoreguidelines-*') so newly added checks in future
# clang-tidy versions are not silently suppressed; only `init-variables` and `pro-type-member-init`
# are enabled.
'-cppcoreguidelines-avoid-capturing-lambda-coroutines',
'-cppcoreguidelines-avoid-const-or-ref-data-members',
'-cppcoreguidelines-avoid-do-while',
'-cppcoreguidelines-avoid-goto',
'-cppcoreguidelines-avoid-non-const-global-variables',
'-cppcoreguidelines-avoid-reference-coroutine-parameters',
'-cppcoreguidelines-interfaces-global-init',
'-cppcoreguidelines-macro-usage',
'-cppcoreguidelines-misleading-capture-default-by-value',
'-cppcoreguidelines-missing-std-forward',
'-cppcoreguidelines-no-malloc',
'-cppcoreguidelines-no-suspend-with-lock',
'-cppcoreguidelines-owning-memory',
'-cppcoreguidelines-prefer-member-initializer',
'-cppcoreguidelines-pro-bounds-array-to-pointer-decay',
'-cppcoreguidelines-pro-bounds-avoid-unchecked-container-access',
'-cppcoreguidelines-pro-bounds-constant-array-index',
'-cppcoreguidelines-pro-bounds-pointer-arithmetic',
'-cppcoreguidelines-pro-type-const-cast',
'-cppcoreguidelines-pro-type-cstyle-cast',
'-cppcoreguidelines-pro-type-reinterpret-cast',
'-cppcoreguidelines-pro-type-static-cast-downcast',
'-cppcoreguidelines-pro-type-union-access',
'-cppcoreguidelines-pro-type-vararg',
'-cppcoreguidelines-rvalue-reference-param-not-moved',
'-cppcoreguidelines-slicing',
'-cppcoreguidelines-special-member-functions',
'-cppcoreguidelines-use-enum-class',
'-cppcoreguidelines-virtual-class-destructor',
# Aliases for checks owned by other modules. Disabled here so they are not silently re-enabled
# now that the wildcard `-cppcoreguidelines-*` is gone; their canonical names are handled
# elsewhere in this file.
'-cppcoreguidelines-avoid-c-arrays', # alias of `modernize-avoid-c-arrays`
'-cppcoreguidelines-avoid-magic-numbers', # alias of `readability-magic-numbers`
'-cppcoreguidelines-c-copy-assignment-signature', # alias of `misc-unconventional-assign-operator`
'-cppcoreguidelines-explicit-virtual-functions', # alias of `modernize-use-override`
'-cppcoreguidelines-macro-to-enum', # alias of `modernize-macro-to-enum`
'-cppcoreguidelines-narrowing-conversions', # alias of `bugprone-narrowing-conversions`
'-cppcoreguidelines-noexcept-destructor', # alias of `performance-noexcept-destructor`
'-cppcoreguidelines-noexcept-move-operations', # alias of `performance-noexcept-move-constructor`
'-cppcoreguidelines-noexcept-swap', # alias of `performance-noexcept-swap`
'-cppcoreguidelines-non-private-member-variables-in-classes', # alias of `misc-non-private-member-variables-in-classes`
'-cppcoreguidelines-use-default-member-init', # alias of `modernize-use-default-member-init`
'-darwin-*',
'-fuchsia-*',
'-google-build-using-namespace',
'-google-readability-braces-around-statements',
'-google-readability-casting',
'-google-readability-function-size',
'-google-readability-namespace-comments',
'-google-readability-todo',
'-hicpp-avoid-c-arrays',
'-hicpp-avoid-goto',
'-hicpp-braces-around-statements',
'-hicpp-explicit-conversions',
'-hicpp-function-size',
# '-hicpp-member-init', # alias of cppcoreguidelines-pro-type-member-init, enabled
'-hicpp-move-const-arg',
'-hicpp-multiway-paths-covered',
'-hicpp-named-parameter',
'-hicpp-no-array-decay',
'-hicpp-no-assembler',
'-hicpp-no-malloc',
'-hicpp-signed-bitwise',
'-hicpp-special-member-functions',
'-hicpp-uppercase-literal-suffix',
'-hicpp-use-auto',
'-hicpp-use-emplace',
'-hicpp-vararg',
'-llvm-*',
'-llvmlibc-*',
'-misc-const-correctness',
'-misc-include-cleaner', # useful but far too many occurrences
'-misc-no-recursion',
'-misc-non-private-member-variables-in-classes',
'-misc-use-anonymous-namespace',
'-misc-use-internal-linkage',
'-modernize-avoid-c-arrays',
'-modernize-concat-nested-namespaces',
'-modernize-pass-by-value',
'-modernize-return-braced-init-list',
'-modernize-use-auto',
'-modernize-use-default-member-init',
'-modernize-use-emplace',
'-modernize-use-nodiscard',
'-modernize-use-ranges',
'-modernize-use-trailing-return-type',
'-modernize-use-designated-initializers',
'-modernize-use-scoped-lock',
'-modernize-use-integer-sign-comparison',
'-performance-avoid-endl',
'-performance-enum-size',
'-performance-inefficient-string-concatenation',
'-performance-inefficient-vector-operation',
'-performance-no-int-to-ptr',
'-performance-unnecessary-value-param',
'-portability-simd-intrinsics',
'-portability-avoid-pragma-once',
'-portability-template-virtual-member-function',
'-readability-avoid-nested-conditional-operator',
'-readability-avoid-unconditional-preprocessor-if',
'-readability-braces-around-statements',
'-readability-convert-member-functions-to-static',
'-readability-else-after-return',
'-readability-function-cognitive-complexity',
'-readability-function-size',
'-readability-identifier-length',
'-readability-identifier-naming', # useful but too slow
'-readability-implicit-bool-conversion',
'-readability-magic-numbers',
'-readability-named-parameter',
'-readability-redundant-declaration',
'-readability-redundant-inline-specifier', # useful but incompatible with __attribute((always_inline))__ (aka. ALWAYS_INLINE, base/base/defines.h).
# ALWAYS_INLINE only has an effect if combined with `inline`: https://godbolt.org/z/Eefd74qdM
'-readability-redundant-member-init', # Useful but triggers another problem. Imagine a struct S with multiple String members. Structs are often instantiated via designated
# initializer S s{.s1 = [...], .s2 = [...], [...]}. In this case, compiler warning `missing-field-initializers` requires to specify all members which are not in-struct
# initialized (example: s1 in struct S { String s1; String s2{};}; is not in-struct initialized, therefore it must be specified at instantiation time). As explicitly
# specifying all members is tedious for large structs, `missing-field-initializers` makes programmers initialize as many members as possible in-struct. Clang-tidy
# warning `readability-redundant-member-init` does the opposite thing, both are not compatible with each other.
'-readability-simplify-boolean-expr',
'-readability-suspicious-call-argument',
'-readability-uppercase-literal-suffix',
'-readability-use-anyofallof',
'-readability-math-missing-parentheses',
'-readability-use-concise-preprocessor-directives',
'-zircon-*'
]
WarningsAsErrors: '*'
ExtraArgs:
# clang-tidy 17 started to complain (for unknown reasons) that various pragmas are unknown ("clang-diagnostic-unknown-pragmas").
# This is technically a compiler error, not a clang-tidy error. We could litter the code base with more pragmas that suppress
# this error but it is better to pass the following flag to the compiler:
- '-Wno-unknown-pragmas'
- '-Wno-unused-command-line-argument' # similar issue
CheckOptions:
readability-identifier-naming.ClassCase: CamelCase
readability-identifier-naming.EnumCase: CamelCase
readability-identifier-naming.LocalVariableCase: lower_case
readability-identifier-naming.StaticConstantCase: aNy_CasE
readability-identifier-naming.MemberCase: lower_case
readability-identifier-naming.PrivateMemberPrefix: ''
readability-identifier-naming.ProtectedMemberPrefix: ''
readability-identifier-naming.PublicMemberCase: lower_case
readability-identifier-naming.MethodCase: camelBack
readability-identifier-naming.PrivateMethodPrefix: ''
readability-identifier-naming.ProtectedMethodPrefix: ''
readability-identifier-naming.ParameterPackCase: lower_case
readability-identifier-naming.StructCase: CamelCase
readability-identifier-naming.TemplateTemplateParameterCase: CamelCase
readability-identifier-naming.TemplateParameterCase: lower_case
readability-identifier-naming.TypeTemplateParameterCase: CamelCase
readability-identifier-naming.TypedefCase: CamelCase
readability-identifier-naming.UnionCase: CamelCase
modernize-loop-convert.UseCxx20ReverseRanges: false
performance-move-const-arg.CheckTriviallyCopyableMove: false
# Workaround clang-tidy bug: https://github.com/llvm/llvm-project/issues/46097
readability-identifier-naming.TypeTemplateParameterIgnoredRegexp: expr-type
cppcoreguidelines-avoid-do-while.IgnoreMacros: true