forked from ClickHouse/ClickHouse
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path.clang-tidy
More file actions
241 lines (210 loc) · 11.2 KB
/
Copy path.clang-tidy
File metadata and controls
241 lines (210 loc) · 11.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# 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