r283092 - [analyzer] Extend bug reports with extra notes

Artem Dergachev via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 3 12:12:39 PDT 2016


 > fatal error C1001: An internal error has occurred in the compiler.

Ouch. So i managed to *crash* the microsoft compiler with my code?

Could you please somehow have a look if this is reproducible? If it's 
reproducible or hard-to-check-if-reproducible then i'd revert.

I don't think i can debug this, as i don't have windows, and i have no 
guesses from looking at the code.

Also, should i have received an email for this failure? Cause i haven't 
received an email for this failure. Hope there aren't more failures.



03/10/2016 21:46, Vitaly Buka via cfe-commits пишет:
> This patch breaks Windows: 
> http://lab.llvm.org:8011/builders/sanitizer-windows/builds/29769/
>
> On Mon, Oct 3, 2016 at 1:07 AM Artem Dergachev via cfe-commits 
> <cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>> wrote:
>
>     Author: dergachev
>     Date: Mon Oct  3 02:58:26 2016
>     New Revision: 283092
>
>     URL: http://llvm.org/viewvc/llvm-project?rev=283092&view=rev
>     Log:
>     [analyzer] Extend bug reports with extra notes
>
>     These diagnostics are separate from the path-sensitive engine's
>     path notes,
>     and can be added manually on top of path-sensitive or
>     path-insensitive reports.
>
>     The new note diagnostics would appear as note:-diagnostic on
>     console and
>     as blue bubbles in scan-build. In plist files they currently do
>     not appear,
>     because format needs to be discussed with plist file users.
>
>     The analyzer option "-analyzer-config notes-as-events=true" would
>     convert
>     notes to normal path notes, and put them at the beginning of the path.
>     This is a temporary hack to show the new notes in plist files.
>
>     A few checkers would be updated in subsequent commits,
>     including tests for this new feature.
>
>     Differential Revision: https://reviews.llvm.org/D24278
>
>     Modified:
>     cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
>     cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
>     cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
>         cfe/trunk/lib/Rewrite/HTMLRewrite.cpp
>         cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
>         cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp
>         cfe/trunk/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
>         cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
>         cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
>         cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
>
>     Modified:
>     cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h?rev=283092&r1=283091&r2=283092&view=diff
>     ==============================================================================
>     --- cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
>     (original)
>     +++ cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
>     Mon Oct  3 02:58:26 2016
>     @@ -266,6 +266,9 @@ private:
>        /// \sa shouldWidenLoops
>        Optional<bool> WidenLoops;
>
>     +  /// \sa shouldDisplayNotesAsEvents
>     +  Optional<bool> DisplayNotesAsEvents;
>     +
>        /// A helper function that retrieves option for a given
>     full-qualified
>        /// checker name.
>        /// Options for checkers can be specified via 'analyzer-config'
>     command-line
>     @@ -534,6 +537,14 @@ public:
>        /// This is controlled by the 'widen-loops' config option.
>        bool shouldWidenLoops();
>
>     +  /// Returns true if the bug reporter should transparently treat
>     extra note
>     +  /// diagnostic pieces as event diagnostic pieces. Useful when
>     the diagnostic
>     +  /// consumer doesn't support the extra note pieces.
>     +  ///
>     +  /// This is controlled by the 'notes-as-events' option, which
>     defaults
>     +  /// to false when unset.
>     +  bool shouldDisplayNotesAsEvents();
>     +
>      public:
>        AnalyzerOptions() :
>          AnalysisStoreOpt(RegionStoreModel),
>
>     Modified:
>     cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h?rev=283092&r1=283091&r2=283092&view=diff
>     ==============================================================================
>     ---
>     cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
>     (original)
>     +++
>     cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
>     Mon Oct  3 02:58:26 2016
>     @@ -66,6 +66,8 @@ public:
>        typedef SmallVector<std::unique_ptr<BugReporterVisitor>, 8>
>     VisitorList;
>        typedef VisitorList::iterator visitor_iterator;
>        typedef SmallVector<StringRef, 2> ExtraTextList;
>     +  typedef
>     SmallVector<llvm::IntrusiveRefCntPtr<PathDiagnosticNotePiece>, 4>
>     +      NoteList;
>
>      protected:
>        friend class BugReporter;
>     @@ -82,7 +84,8 @@ protected:
>        const ExplodedNode *ErrorNode;
>        SmallVector<SourceRange, 4> Ranges;
>        ExtraTextList ExtraText;
>     -
>     +  NoteList Notes;
>     +
>        typedef llvm::DenseSet<SymbolRef> Symbols;
>        typedef llvm::DenseSet<const MemRegion *> Regions;
>
>     @@ -177,6 +180,18 @@ public:
>        const BugType& getBugType() const { return BT; }
>        BugType& getBugType() { return BT; }
>
>     +  /// \brief True when the report has an execution path
>     associated with it.
>     +  ///
>     +  /// A report is said to be path-sensitive if it was thrown
>     against a
>     +  /// particular exploded node in the path-sensitive analysis graph.
>     +  /// Path-sensitive reports have their intermediate path diagnostics
>     +  /// auto-generated, perhaps with the help of checker-defined
>     visitors,
>     +  /// and may contain extra notes.
>     +  /// Path-insensitive reports consist only of a single warning
>     message
>     +  /// in a specific location, and perhaps extra notes.
>     +  /// Path-sensitive checkers are allowed to throw
>     path-insensitive reports.
>     +  bool isPathSensitive() const { return ErrorNode != nullptr; }
>     +
>        const ExplodedNode *getErrorNode() const { return ErrorNode; }
>
>        StringRef getDescription() const { return Description; }
>     @@ -245,7 +260,27 @@ public:
>        void setDeclWithIssue(const Decl *declWithIssue) {
>          DeclWithIssue = declWithIssue;
>        }
>     -
>     +
>     +  /// Add new item to the list of additional notes that need to
>     be attached to
>     +  /// this path-insensitive report. If you want to add extra
>     notes to a
>     +  /// path-sensitive report, you need to use a BugReporterVisitor
>     because it
>     +  /// allows you to specify where exactly in the auto-generated
>     path diagnostic
>     +  /// the extra note should appear.
>     +  void addNote(StringRef Msg, const PathDiagnosticLocation &Pos,
>     +                    ArrayRef<SourceRange> Ranges = {}) {
>     +    PathDiagnosticNotePiece *P =
>     +        new PathDiagnosticNotePiece(Pos, Msg);
>     +
>     +    for (const auto &R : Ranges)
>     +      P->addRange(R);
>     +
>     +    Notes.push_back(P);
>     +  }
>     +
>     +  virtual const NoteList &getNotes() {
>     +    return Notes;
>     +  }
>     +
>        /// \brief This allows for addition of meta data to the diagnostic.
>        ///
>        /// Currently, only the HTMLDiagnosticClient knows how to
>     display it.
>
>     Modified:
>     cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h?rev=283092&r1=283091&r2=283092&view=diff
>     ==============================================================================
>     ---
>     cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
>     (original)
>     +++
>     cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
>     Mon Oct  3 02:58:26 2016
>     @@ -336,7 +336,7 @@ public:
>
>      class PathDiagnosticPiece : public RefCountedBaseVPTR {
>      public:
>     -  enum Kind { ControlFlow, Event, Macro, Call };
>     +  enum Kind { ControlFlow, Event, Macro, Call, Note };
>        enum DisplayHint { Above, Below };
>
>      private:
>     @@ -452,7 +452,8 @@ public:
>        void Profile(llvm::FoldingSetNodeID &ID) const override;
>
>        static bool classof(const PathDiagnosticPiece *P) {
>     -    return P->getKind() == Event || P->getKind() == Macro;
>     +    return P->getKind() == Event || P->getKind() == Macro ||
>     +           P->getKind() == Note;
>        }
>      };
>
>     @@ -706,6 +707,23 @@ public:
>        }
>
>        void dump() const override;
>     +
>     +  void Profile(llvm::FoldingSetNodeID &ID) const override;
>     +};
>     +
>     +class PathDiagnosticNotePiece: public PathDiagnosticSpotPiece {
>     +public:
>     +  PathDiagnosticNotePiece(const PathDiagnosticLocation &Pos,
>     StringRef S,
>     +                               bool AddPosRange = true)
>     +      : PathDiagnosticSpotPiece(Pos, S, Note, AddPosRange) {}
>     +
>     +  ~PathDiagnosticNotePiece() override;
>     +
>     +  static inline bool classof(const PathDiagnosticPiece *P) {
>     +    return P->getKind() == Note;
>     +  }
>     +
>     +  void dump() const override;
>
>        void Profile(llvm::FoldingSetNodeID &ID) const override;
>      };
>
>     Modified: cfe/trunk/lib/Rewrite/HTMLRewrite.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/HTMLRewrite.cpp?rev=283092&r1=283091&r2=283092&view=diff
>     ==============================================================================
>     --- cfe/trunk/lib/Rewrite/HTMLRewrite.cpp (original)
>     +++ cfe/trunk/lib/Rewrite/HTMLRewrite.cpp Mon Oct  3 02:58:26 2016
>     @@ -324,6 +324,7 @@ void html::AddHeaderFooterInternalBuilti
>            " .msgT { padding:0x; spacing:0x }\n"
>            " .msgEvent { background-color:#fff8b4; color:#000000 }\n"
>            " .msgControl { background-color:#bbbbbb; color:#000000 }\n"
>     +      " .msgNote { background-color:#ddeeff; color:#000000 }\n"
>            " .mrange { background-color:#dfddf3 }\n"
>            " .mrange { border-bottom:1px solid #6F9DBE }\n"
>            " .PathIndex { font-weight: bold; padding:0px 5px; "
>     @@ -343,8 +344,12 @@ void html::AddHeaderFooterInternalBuilti
>            "   border-collapse: collapse; border-spacing: 0px;\n"
>            " }\n"
>            " td.rowname {\n"
>     -      "   text-align:right; font-weight:bold; color:#444444;\n"
>     -      "   padding-right:2ex; }\n"
>     +      "   text-align: right;\n"
>     +      "   vertical-align: top;\n"
>     +      "   font-weight: bold;\n"
>     +      "   color:#444444;\n"
>     +      "   padding-right:2ex;\n"
>     +      " }\n"
>            "</style>\n</head>\n<body>";
>
>        // Generate header
>
>     Modified: cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp?rev=283092&r1=283091&r2=283092&view=diff
>     ==============================================================================
>     --- cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp (original)
>     +++ cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp Mon Oct 
>     3 02:58:26 2016
>     @@ -344,3 +344,10 @@ bool AnalyzerOptions::shouldWidenLoops()
>          WidenLoops = getBooleanOption("widen-loops", /*Default=*/false);
>        return WidenLoops.getValue();
>      }
>     +
>     +bool AnalyzerOptions::shouldDisplayNotesAsEvents() {
>     +  if (!DisplayNotesAsEvents.hasValue())
>     +    DisplayNotesAsEvents =
>     +        getBooleanOption("notes-as-events", /*Default=*/false);
>     +  return DisplayNotesAsEvents.getValue();
>     +}
>
>     Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp?rev=283092&r1=283091&r2=283092&view=diff
>     ==============================================================================
>     --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp (original)
>     +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp Mon Oct 3
>     02:58:26 2016
>     @@ -112,15 +112,15 @@ static void removeRedundantMsgs(PathPiec
>          path.pop_front();
>
>          switch (piece->getKind()) {
>     -      case clang::ento::PathDiagnosticPiece::Call:
>     +      case PathDiagnosticPiece::Call:
>      removeRedundantMsgs(cast<PathDiagnosticCallPiece>(piece)->path);
>              break;
>     -      case clang::ento::PathDiagnosticPiece::Macro:
>     +      case PathDiagnosticPiece::Macro:
>      removeRedundantMsgs(cast<PathDiagnosticMacroPiece>(piece)->subPieces);
>              break;
>     -      case clang::ento::PathDiagnosticPiece::ControlFlow:
>     +      case PathDiagnosticPiece::ControlFlow:
>              break;
>     -      case clang::ento::PathDiagnosticPiece::Event: {
>     +      case PathDiagnosticPiece::Event: {
>              if (i == N-1)
>                break;
>
>     @@ -140,6 +140,8 @@ static void removeRedundantMsgs(PathPiec
>              }
>              break;
>            }
>     +      case PathDiagnosticPiece::Note:
>     +        break;
>          }
>          path.push_back(piece);
>        }
>     @@ -197,6 +199,9 @@ static bool removeUnneededCalls(PathPiec
>            }
>            case PathDiagnosticPiece::ControlFlow:
>              break;
>     +
>     +      case PathDiagnosticPiece::Note:
>     +        break;
>          }
>
>          pieces.push_back(piece);
>     @@ -3403,25 +3408,28 @@ void BugReporter::FlushReport(BugReport
>            exampleReport->getUniqueingLocation(),
>            exampleReport->getUniqueingDecl()));
>
>     -  MaxBugClassSize = std::max(bugReports.size(),
>     -  static_cast<size_t>(MaxBugClassSize));
>     +  if (exampleReport->isPathSensitive()) {
>     +    // Generate the full path diagnostic, using the generation scheme
>     +    // specified by the PathDiagnosticConsumer. Note that we have
>     to generate
>     +    // path diagnostics even for consumers which do not support
>     paths, because
>     +    // the BugReporterVisitors may mark this bug as a false positive.
>     +    assert(!bugReports.empty());
>     +
>     +    MaxBugClassSize =
>     +        std::max(bugReports.size(),
>     static_cast<size_t>(MaxBugClassSize));
>
>     -  // Generate the full path diagnostic, using the generation scheme
>     -  // specified by the PathDiagnosticConsumer. Note that we have
>     to generate
>     -  // path diagnostics even for consumers which do not support
>     paths, because
>     -  // the BugReporterVisitors may mark this bug as a false positive.
>     -  if (!bugReports.empty())
>          if (!generatePathDiagnostic(*D.get(), PD, bugReports))
>            return;
>
>     -  MaxValidBugClassSize = std::max(bugReports.size(),
>     - static_cast<size_t>(MaxValidBugClassSize));
>     +    MaxValidBugClassSize =
>     +        std::max(bugReports.size(),
>     static_cast<size_t>(MaxValidBugClassSize));
>
>     -  // Examine the report and see if the last piece is in a header.
>     Reset the
>     -  // report location to the last piece in the main source file.
>     -  AnalyzerOptions& Opts = getAnalyzerOptions();
>     -  if (Opts.shouldReportIssuesInMainSourceFile() && !Opts.AnalyzeAll)
>     -    D->resetDiagnosticLocationToMainFile();
>     +    // Examine the report and see if the last piece is in a
>     header. Reset the
>     +    // report location to the last piece in the main source file.
>     +    AnalyzerOptions &Opts = getAnalyzerOptions();
>     +    if (Opts.shouldReportIssuesInMainSourceFile() &&
>     !Opts.AnalyzeAll)
>     +      D->resetDiagnosticLocationToMainFile();
>     +  }
>
>        // If the path is empty, generate a single step path with the
>     location
>        // of the issue.
>     @@ -3434,6 +3442,27 @@ void BugReporter::FlushReport(BugReport
>          D->setEndOfPath(std::move(piece));
>        }
>
>     +  PathPieces &Pieces = D->getMutablePieces();
>     +  if (getAnalyzerOptions().shouldDisplayNotesAsEvents()) {
>     +    // For path diagnostic consumers that don't support extra notes,
>     +    // we may optionally convert those to path notes.
>     +    for (auto I = exampleReport->getNotes().rbegin(),
>     +              E = exampleReport->getNotes().rend(); I != E; ++I) {
>     +      PathDiagnosticNotePiece *Piece = I->get();
>     +      PathDiagnosticEventPiece *ConvertedPiece =
>     +          new PathDiagnosticEventPiece(Piece->getLocation(),
>     +  Piece->getString());
>     +      for (const auto &R: Piece->getRanges())
>     +        ConvertedPiece->addRange(R);
>     +
>     +      Pieces.push_front(ConvertedPiece);
>     +    }
>     +  } else {
>     +    for (auto I = exampleReport->getNotes().rbegin(),
>     +              E = exampleReport->getNotes().rend(); I != E; ++I)
>     +      Pieces.push_front(*I);
>     +  }
>     +
>        // Get the meta data.
>        const BugReport::ExtraTextList &Meta =
>     exampleReport->getExtraText();
>        for (BugReport::ExtraTextList::const_iterator i = Meta.begin(),
>     @@ -3518,6 +3547,13 @@ LLVM_DUMP_METHOD void PathDiagnosticMacr
>        // FIXME: Print which macro is being invoked.
>      }
>
>     +LLVM_DUMP_METHOD void PathDiagnosticNotePiece::dump() const {
>     +  llvm::errs() << "NOTE\n--------------\n";
>     +  llvm::errs() << getString() << "\n";
>     +  llvm::errs() << " ---- at ----\n";
>     +  getLocation().dump();
>     +}
>     +
>      LLVM_DUMP_METHOD void PathDiagnosticLocation::dump() const {
>        if (!isValid()) {
>          llvm::errs() << "<INVALID>\n";
>
>     Modified: cfe/trunk/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp?rev=283092&r1=283091&r2=283092&view=diff
>     ==============================================================================
>     --- cfe/trunk/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp (original)
>     +++ cfe/trunk/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp Mon Oct 
>     3 02:58:26 2016
>     @@ -152,13 +152,30 @@ void HTMLDiagnostics::ReportDiag(const P
>        }
>
>        // Process the path.
>     -  unsigned n = path.size();
>     -  unsigned max = n;
>     -
>     -  for (PathPieces::const_reverse_iterator I = path.rbegin(),
>     -       E = path.rend();
>     -        I != E; ++I, --n)
>     -    HandlePiece(R, FID, **I, n, max);
>     +  // Maintain the counts of extra note pieces separately.
>     +  unsigned TotalPieces = path.size();
>     +  unsigned TotalNotePieces =
>     +      std::count_if(path.begin(), path.end(),
>     +                    [](const
>     IntrusiveRefCntPtr<PathDiagnosticPiece> &p) {
>     +                      return isa<PathDiagnosticNotePiece>(p.get());
>     +                    });
>     +
>     +  unsigned TotalRegularPieces = TotalPieces - TotalNotePieces;
>     +  unsigned NumRegularPieces = TotalRegularPieces;
>     +  unsigned NumNotePieces = TotalNotePieces;
>     +
>     +  for (auto I = path.rbegin(), E = path.rend(); I != E; ++I) {
>     +    if (isa<PathDiagnosticNotePiece>(I->get())) {
>     +      // This adds diagnostic bubbles, but not navigation.
>     +      // Navigation through note pieces would be added later,
>     +      // as a separate pass through the piece list.
>     +      HandlePiece(R, FID, **I, NumNotePieces, TotalNotePieces);
>     +      --NumNotePieces;
>     +    } else {
>     +      HandlePiece(R, FID, **I, NumRegularPieces, TotalRegularPieces);
>     +      --NumRegularPieces;
>     +    }
>     +  }
>
>        // Add line numbers, header, footer, etc.
>
>     @@ -192,24 +209,38 @@ void HTMLDiagnostics::ReportDiag(const P
>        int ColumnNumber =
>     path.back()->getLocation().asLocation().getExpansionColumnNumber();
>
>        // Add the name of the file as an <h1> tag.
>     -
>        {
>          std::string s;
>          llvm::raw_string_ostream os(s);
>
>          os << "<!-- REPORTHEADER -->\n"
>     -      << "<h3>Bug Summary</h3>\n<table class=\"simpletable\">\n"
>     +       << "<h3>Bug Summary</h3>\n<table class=\"simpletable\">\n"
>                "<tr><td class=\"rowname\">File:</td><td>"
>     -      << html::EscapeText(DirName)
>     -      << html::EscapeText(Entry->getName())
>     -      << "</td></tr>\n<tr><td class=\"rowname\">Location:</td><td>"
>     -         "<a href=\"#EndPath\">line "
>     -      << LineNumber
>     -      << ", column "
>     -      << ColumnNumber
>     -      << "</a></td></tr>\n"
>     -         "<tr><td class=\"rowname\">Description:</td><td>"
>     -      << D.getVerboseDescription() << "</td></tr>\n";
>     +       << html::EscapeText(DirName)
>     +       << html::EscapeText(Entry->getName())
>     +       << "</td></tr>\n<tr><td class=\"rowname\">Warning:</td><td>"
>     +          "<a href=\"#EndPath\">line "
>     +       << LineNumber
>     +       << ", column "
>     +       << ColumnNumber
>     +       << "</a><br />"
>     +       << D.getVerboseDescription() << "</td></tr>\n";
>     +
>     +    // The navigation across the extra notes pieces.
>     +    unsigned NumExtraPieces = 0;
>     +    for (const auto &Piece : path) {
>     +      if (const auto *P =
>     dyn_cast<PathDiagnosticNotePiece>(Piece.get())) {
>     +        int LineNumber =
>     + P->getLocation().asLocation().getExpansionLineNumber();
>     +        int ColumnNumber =
>     + P->getLocation().asLocation().getExpansionColumnNumber();
>     +        os << "<tr><td class=\"rowname\">Note:</td><td>"
>     +           << "<a href=\"#Note" << NumExtraPieces << "\">line "
>     +           << LineNumber << ", column " << ColumnNumber <<
>     "</a><br />"
>     +           << P->getString() << "</td></tr>";
>     +        ++NumExtraPieces;
>     +      }
>     +    }
>
>          // Output any other meta data.
>
>     @@ -385,13 +416,20 @@ void HTMLDiagnostics::HandlePiece(Rewrit
>        // Create the html for the message.
>
>        const char *Kind = nullptr;
>     +  bool IsNote = false;
>     +  bool SuppressIndex = (max == 1);
>        switch (P.getKind()) {
>        case PathDiagnosticPiece::Call:
>     -      llvm_unreachable("Calls should already be handled");
>     +      llvm_unreachable("Calls and extra notes should already be
>     handled");
>        case PathDiagnosticPiece::Event:  Kind = "Event"; break;
>        case PathDiagnosticPiece::ControlFlow: Kind = "Control"; break;
>          // Setting Kind to "Control" is intentional.
>        case PathDiagnosticPiece::Macro: Kind = "Control"; break;
>     +  case PathDiagnosticPiece::Note:
>     +    Kind = "Note";
>     +    IsNote = true;
>     +    SuppressIndex = true;
>     +    break;
>        }
>
>        std::string sbuf;
>     @@ -399,7 +437,9 @@ void HTMLDiagnostics::HandlePiece(Rewrit
>
>        os << "\n<tr><td class=\"num\"></td><td class=\"line\"><div id=\"";
>
>     -  if (num == max)
>     +  if (IsNote)
>     +    os << "Note" << num;
>     +  else if (num == max)
>          os << "EndPath";
>        else
>          os << "Path" << num;
>     @@ -461,7 +501,7 @@ void HTMLDiagnostics::HandlePiece(Rewrit
>
>        os << "\">";
>
>     -  if (max > 1) {
>     +  if (!SuppressIndex) {
>          os << "<table class=\"msgT\"><tr><td valign=\"top\">";
>          os << "<div class=\"PathIndex";
>          if (Kind) os << " PathIndex" << Kind;
>     @@ -501,7 +541,7 @@ void HTMLDiagnostics::HandlePiece(Rewrit
>
>          os << "':\n";
>
>     -    if (max > 1) {
>     +    if (!SuppressIndex) {
>            os << "</td>";
>            if (num < max) {
>              os << "<td><div class=\"PathNav\"><a href=\"#";
>     @@ -523,7 +563,7 @@ void HTMLDiagnostics::HandlePiece(Rewrit
>        else {
>          os << html::EscapeText(P.getString());
>
>     -    if (max > 1) {
>     +    if (!SuppressIndex) {
>            os << "</td>";
>            if (num < max) {
>              os << "<td><div class=\"PathNav\"><a href=\"#";
>
>     Modified: cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp?rev=283092&r1=283091&r2=283092&view=diff
>     ==============================================================================
>     --- cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp (original)
>     +++ cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp Mon Oct 
>     3 02:58:26 2016
>     @@ -60,6 +60,7 @@ PathDiagnosticEventPiece::~PathDiagnosti
>      PathDiagnosticCallPiece::~PathDiagnosticCallPiece() {}
>      PathDiagnosticControlFlowPiece::~PathDiagnosticControlFlowPiece() {}
>      PathDiagnosticMacroPiece::~PathDiagnosticMacroPiece() {}
>     +PathDiagnosticNotePiece::~PathDiagnosticNotePiece() {}
>
>      void PathPieces::flattenTo(PathPieces &Primary, PathPieces &Current,
>                                 bool ShouldFlattenMacros) const {
>     @@ -95,6 +96,7 @@ void PathPieces::flattenTo(PathPieces &P
>          }
>          case PathDiagnosticPiece::Event:
>          case PathDiagnosticPiece::ControlFlow:
>     +    case PathDiagnosticPiece::Note:
>            Current.push_back(Piece);
>            break;
>          }
>     @@ -342,15 +344,16 @@ static Optional<bool> comparePiece(const
>        }
>
>        switch (X.getKind()) {
>     -    case clang::ento::PathDiagnosticPiece::ControlFlow:
>     +    case PathDiagnosticPiece::ControlFlow:
>            return
>     compareControlFlow(cast<PathDiagnosticControlFlowPiece>(X),
>      cast<PathDiagnosticControlFlowPiece>(Y));
>     -    case clang::ento::PathDiagnosticPiece::Event:
>     +    case PathDiagnosticPiece::Event:
>     +    case PathDiagnosticPiece::Note:
>            return None;
>     -    case clang::ento::PathDiagnosticPiece::Macro:
>     +    case PathDiagnosticPiece::Macro:
>            return compareMacro(cast<PathDiagnosticMacroPiece>(X),
>      cast<PathDiagnosticMacroPiece>(Y));
>     -    case clang::ento::PathDiagnosticPiece::Call:
>     +    case PathDiagnosticPiece::Call:
>            return compareCall(cast<PathDiagnosticCallPiece>(X),
>     cast<PathDiagnosticCallPiece>(Y));
>        }
>     @@ -1098,6 +1101,10 @@ void PathDiagnosticMacroPiece::Profile(l
>          ID.Add(**I);
>      }
>
>     +void PathDiagnosticNotePiece::Profile(llvm::FoldingSetNodeID &ID)
>     const {
>     +  PathDiagnosticSpotPiece::Profile(ID);
>     +}
>     +
>      void PathDiagnostic::Profile(llvm::FoldingSetNodeID &ID) const {
>        ID.Add(getLocation());
>        ID.AddString(BugType);
>
>     Modified: cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp?rev=283092&r1=283091&r2=283092&view=diff
>     ==============================================================================
>     --- cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp (original)
>     +++ cfe/trunk/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp Mon
>     Oct  3 02:58:26 2016
>     @@ -281,6 +281,9 @@ static void ReportPiece(raw_ostream &o,
>            ReportMacro(o, cast<PathDiagnosticMacroPiece>(P), FM, SM,
>     LangOpts,
>                        indent, depth);
>            break;
>     +    case PathDiagnosticPiece::Note:
>     +      // FIXME: Extend the plist format to support those.
>     +      break;
>        }
>      }
>
>
>     Modified: cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp?rev=283092&r1=283091&r2=283092&view=diff
>     ==============================================================================
>     --- cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
>     (original)
>     +++ cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp Mon
>     Oct  3 02:58:26 2016
>     @@ -113,16 +113,28 @@ public:
>            Diag.Report(WarnLoc, WarnID) << PD->getShortDescription()
>                                         << PD->path.back()->getRanges();
>
>     +      // First, add extra notes, even if paths should not be
>     included.
>     +      for (const auto &Piece : PD->path) {
>     +        if (!isa<PathDiagnosticNotePiece>(Piece.get()))
>     +          continue;
>     +
>     +        SourceLocation NoteLoc = Piece->getLocation().asLocation();
>     +        Diag.Report(NoteLoc, NoteID) << Piece->getString()
>     +                                     << Piece->getRanges();
>     +      }
>     +
>            if (!IncludePath)
>              continue;
>
>     +      // Then, add the path notes if necessary.
>            PathPieces FlatPath =
>     PD->path.flatten(/*ShouldFlattenMacros=*/true);
>     -      for (PathPieces::const_iterator PI = FlatPath.begin(),
>     -                                      PE = FlatPath.end();
>     -           PI != PE; ++PI) {
>     -        SourceLocation NoteLoc = (*PI)->getLocation().asLocation();
>     -        Diag.Report(NoteLoc, NoteID) << (*PI)->getString()
>     -                                     << (*PI)->getRanges();
>     +      for (const auto &Piece : FlatPath) {
>     +        if (isa<PathDiagnosticNotePiece>(Piece.get()))
>     +          continue;
>     +
>     +        SourceLocation NoteLoc = Piece->getLocation().asLocation();
>     +        Diag.Report(NoteLoc, NoteID) << Piece->getString()
>     +                                     << Piece->getRanges();
>            }
>          }
>        }
>
>
>     _______________________________________________
>     cfe-commits mailing list
>     cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>
>     http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
>
> _______________________________________________
> 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/20161003/52491ffa/attachment-0001.html>


More information about the cfe-commits mailing list