[clang-tools-extra] r298421 - Prevent cppcoreguidelines-pro-bounds-array-to-pointer-decay from diagnosing array to pointer decay stemming from system macros.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 21 18:36:33 PDT 2017


Thank you!

On 21 March 2017 at 18:22, Aaron Ballman <aaron at aaronballman.com> wrote:

> On Tue, Mar 21, 2017 at 9:15 PM, Richard Smith <richard at metafoo.co.uk>
> wrote:
> > On 21 March 2017 at 12:01, Aaron Ballman via cfe-commits
> > <cfe-commits at 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?
>
> I am now wondering the same question...
>
> I've rolled this back r298470 and will follow up with the author.
>
> Thanks!
>
> ~Aaron
>
> >
> >> +
> >> +  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 at lists.llvm.org
> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170321/0becb36c/attachment-0001.html>


More information about the cfe-commits mailing list