# 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)$' 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', '-cert-dcl16-c', '-cert-err58-cpp', '-clang-analyzer-optin.performance.Padding', '-cppcoreguidelines-*', # impractical in a codebase as large as ClickHouse, also slow '-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', '-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', '-performance-avoid-endl', '-performance-enum-size', '-performance-inefficient-string-concatenation', '-performance-no-int-to-ptr', '-performance-unnecessary-value-param', '-portability-simd-intrinsics', '-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', '-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