Skip to content

Commit b55fb56

Browse files
authored
[clang-tidy] Improve bugprone-multi-level-implicit-pointer-conversion (#94524)
Ignore implicit pointer conversions that are part of a cast expression Closes #93959
1 parent 31b84d4 commit b55fb56

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

clang-tools-extra/clang-tidy/bugprone/MultiLevelImplicitPointerConversionCheck.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,21 @@ AST_MATCHER(ImplicitCastExpr, isMultiLevelPointerConversion) {
4848
return SourcePtrLevel != TargetPtrLevel;
4949
}
5050

51+
AST_MATCHER(QualType, isPointerType) {
52+
const QualType Type =
53+
Node.getCanonicalType().getNonReferenceType().getUnqualifiedType();
54+
55+
return !Type.isNull() && Type->isPointerType();
56+
}
57+
5158
} // namespace
5259

5360
void MultiLevelImplicitPointerConversionCheck::registerMatchers(
5461
MatchFinder *Finder) {
5562
Finder->addMatcher(
56-
implicitCastExpr(hasCastKind(CK_BitCast), isMultiLevelPointerConversion())
63+
implicitCastExpr(hasCastKind(CK_BitCast), isMultiLevelPointerConversion(),
64+
unless(hasParent(explicitCastExpr(
65+
hasDestinationType(isPointerType())))))
5766
.bind("expr"),
5867
this);
5968
}

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,10 @@ Changes in existing checks
224224
check by ignoring ``__func__`` macro in lambda captures, initializers of
225225
default parameters and nested function declarations.
226226

227+
- Improved :doc:`bugprone-multi-level-implicit-pointer-conversion
228+
<clang-tidy/checks/bugprone/multi-level-implicit-pointer-conversion>` check
229+
by ignoring implicit pointer conversions that are part of a cast expression.
230+
227231
- Improved :doc:`bugprone-non-zero-enum-to-bool-conversion
228232
<clang-tidy/checks/bugprone/non-zero-enum-to-bool-conversion>` check by
229233
eliminating false positives resulting from direct usage of bitwise operators

clang-tools-extra/test/clang-tidy/checkers/bugprone/multi-level-implicit-pointer-conversion.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,15 @@ void test()
6363

6464
takeSecondLevelVoidPtr(getSecondLevelVoidPtr());
6565
}
66+
67+
namespace PR93959 {
68+
void free(void*);
69+
70+
void test() {
71+
char **p = nullptr;
72+
free(p);
73+
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: multilevel pointer conversion from 'char **' to 'void *', please use explicit cast [bugprone-multi-level-implicit-pointer-conversion]
74+
free((void *)p);
75+
free(static_cast<void *>(p));
76+
}
77+
}

0 commit comments

Comments
 (0)