On 21 March 2017 at 12:01, Aaron Ballman via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: aaronballman > Date: Tue Mar 21 14:01:17 2017 > New Revision: 298421 > > URL: http://llvm.org/viewvc/llvm-project?rev=298421&view=rev > Log: > Prevent cppcoreguidelines-pro-bounds-array-to-pointer-decay from > diagnosing array to pointer decay stemming from system macros. > > Patch by Breno Rodrigues Guimaraes. > > Modified: > clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ > ProBoundsArrayToPointerDecayCheck.cpp > clang-tools-extra/trunk/test/clang-tidy/cppcoreguidelines- > pro-bounds-array-to-pointer-decay.cpp > > Modified: clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ > ProBoundsArrayToPointerDecayCheck.cpp > URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/ > trunk/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCh > eck.cpp?rev=298421&r1=298420&r2=298421&view=diff > ============================================================ > ================== > --- clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ > ProBoundsArrayToPointerDecayCheck.cpp (original) > +++ clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ > ProBoundsArrayToPointerDecayCheck.cpp Tue Mar 21 14:01:17 2017 > @@ -47,6 +47,25 @@ AST_MATCHER_P(Expr, hasParentIgnoringImp > 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:: > // 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:: > 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 " > > Modified: clang-tools-extra/trunk/test/clang-tidy/cppcoreguidelines- > pro-bounds-array-to-pointer-decay.cpp > URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/ > trunk/test/clang-tidy/cppcoreguidelines-pro-bounds- > array-to-pointer-decay.cpp?rev=298421&r1=298420&r2=298421&view=diff > ============================================================ > ================== > --- clang-tools-extra/trunk/test/clang-tidy/cppcoreguidelines- > pro-bounds-array-to-pointer-decay.cpp (original) > +++ clang-tools-extra/trunk/test/clang-tidy/cppcoreguidelines- > pro-bounds-array-to-pointer-decay.cpp Tue Mar 21 14:01:17 2017 > @@ -1,4 +1,5 @@ > // RUN: %check_clang_tidy %s > cppcoreguidelines-pro-bounds-array-to-pointer-decay > %t > +#include <assert.h> > This test is using a header that we do not supply (unlike stddef.h which Clang provides itself). That does not seem especially reasonable to me; this test is failing for us as a result. Can you supply a fake <assert.h> system header as an input to this test? > #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 > Huh? What decay is this referring to? + > + 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() { > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits