[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:15:17 PDT 2017
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?
+
> + 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/00183333/attachment.html>
More information about the cfe-commits
mailing list