forked from OSchip/llvm-project
Prevent cppcoreguidelines-pro-bounds-array-to-pointer-decay from diagnosing array to pointer decay stemming from system macros.
Patch by Breno Rodrigues Guimaraes. llvm-svn: 298421
This commit is contained in:
parent
9c1e310c16
commit
163e7166d7
|
@ -47,6 +47,25 @@ AST_MATCHER_P(Expr, hasParentIgnoringImpCasts,
|
|||
return InnerMatcher.matches(*E, Finder, Builder);
|
||||
}
|
||||
|
||||
AST_MATCHER(ImplicitCastExpr, isArrayToPointerDecay) {
|
||||
return Node.getCastKind() == CK_ArrayToPointerDecay;
|
||||
}
|
||||
|
||||
AST_MATCHER(ImplicitCastExpr, sysSymbolDecayInSysHeader) {
|
||||
auto &SM = Finder->getASTContext().getSourceManager();
|
||||
if (SM.isInSystemMacro(Node.getLocStart())) {
|
||||
if (isa<PredefinedExpr>(Node.getSubExpr()))
|
||||
return true;
|
||||
|
||||
if (const auto *SymbolDeclRef = dyn_cast<DeclRefExpr>(Node.getSubExpr())) {
|
||||
const ValueDecl *SymbolDecl = SymbolDeclRef->getDecl();
|
||||
if (SymbolDecl && SM.isInSystemHeader(SymbolDecl->getLocation()))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void ProBoundsArrayToPointerDecayCheck::registerMatchers(MatchFinder *Finder) {
|
||||
if (!getLangOpts().CPlusPlus)
|
||||
return;
|
||||
|
@ -56,10 +75,12 @@ void ProBoundsArrayToPointerDecayCheck::registerMatchers(MatchFinder *Finder) {
|
|||
// 2) inside a range-for over an array
|
||||
// 3) if it converts a string literal to a pointer
|
||||
Finder->addMatcher(
|
||||
implicitCastExpr(unless(hasParent(arraySubscriptExpr())),
|
||||
implicitCastExpr(isArrayToPointerDecay(),
|
||||
unless(hasParent(arraySubscriptExpr())),
|
||||
unless(hasParentIgnoringImpCasts(explicitCastExpr())),
|
||||
unless(isInsideOfRangeBeginEndStmt()),
|
||||
unless(hasSourceExpression(stringLiteral())))
|
||||
unless(hasSourceExpression(stringLiteral())),
|
||||
unless(sysSymbolDecayInSysHeader()))
|
||||
.bind("cast"),
|
||||
this);
|
||||
}
|
||||
|
@ -67,8 +88,6 @@ void ProBoundsArrayToPointerDecayCheck::registerMatchers(MatchFinder *Finder) {
|
|||
void ProBoundsArrayToPointerDecayCheck::check(
|
||||
const MatchFinder::MatchResult &Result) {
|
||||
const auto *MatchedCast = Result.Nodes.getNodeAs<ImplicitCastExpr>("cast");
|
||||
if (MatchedCast->getCastKind() != CK_ArrayToPointerDecay)
|
||||
return;
|
||||
|
||||
diag(MatchedCast->getExprLoc(), "do not implicitly decay an array into a "
|
||||
"pointer; consider using gsl::array_view or "
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// RUN: %check_clang_tidy %s cppcoreguidelines-pro-bounds-array-to-pointer-decay %t
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
|
||||
namespace gsl {
|
||||
|
@ -34,6 +35,11 @@ void f() {
|
|||
|
||||
for (auto &e : a) // OK, iteration internally decays array to pointer
|
||||
e = 1;
|
||||
|
||||
assert(false); // OK, array decay inside system header macro
|
||||
|
||||
assert(a);
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not implicitly decay an array into a pointer; consider using gsl::array_view or an explicit cast instead [cppcoreguidelines-pro-bounds-array-to-pointer-decay]
|
||||
}
|
||||
|
||||
const char *g() {
|
||||
|
|
Loading…
Reference in New Issue