r283092 - [analyzer] Extend bug reports with extra notes
Vitaly Buka via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 3 13:26:03 PDT 2016
I will look into this and get back to you.
On Mon, Oct 3, 2016 at 12:12 PM Artem Dergachev <noqnoqneo at gmail.com> wrote:
> > 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> 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
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
>
> _______________________________________________
> cfe-commits mailing listcfe-commits at lists.llvm.orghttp://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/b8782c4f/attachment-0001.html>
More information about the cfe-commits
mailing list