# 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-derived-method-shadowing-base-method', '-bugprone-easily-swappable-parameters', '-bugprone-exception-escape', '-bugprone-implicit-widening-of-multiplication-result', '-bugprone-invalid-enum-default-initialization', '-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 '-bugprone-throwing-static-initialization', '-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-core.NullPointerArithm', '-clang-analyzer-optin.performance.Padding', '-clang-analyzer-security.ArrayBound', # only false positives '-clang-analyzer-cplusplus.NewDelete', # false positive on boost::split/is_any_of, reported inside the header so NOLINT at the call site cannot suppress it '-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', '-google-runtime-float', # `long double` is used deliberately in a few places, e.g. `shift10` relies on it to delay # rounding until after the decimal shift, which `readFloatTextFastImpl` needs for correct Float64 parsing '-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-multiple-inheritance', '-misc-non-private-member-variables-in-classes', '-misc-override-with-different-visibility', '-misc-use-anonymous-namespace', '-misc-use-internal-linkage', '-modernize-avoid-c-arrays', '-modernize-avoid-c-style-cast', '-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-inconsistent-declaration-parameter-name', '-readability-identifier-naming', # useful but too slow '-readability-implicit-bool-conversion', '-readability-inconsistent-ifelse-braces', '-readability-magic-numbers', '-readability-named-parameter', '-readability-redundant-declaration', '-readability-redundant-typename', '-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