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

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 21 18:22:17 PDT 2017


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/ProBoundsArrayToPointerDecayCheck.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
>
>


More information about the cfe-commits mailing list