r283092 - [analyzer] Extend bug reports with extra notes
Artem Dergachev via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 3 13:31:23 PDT 2016
I also made a quick blind guess at r283141
(http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20161003/172390.html)
Thanks a lot for trying to help, sorry for causing problems.
03/10/2016 23:26, Vitaly Buka пишет:
> 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
> <mailto: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 <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 <mailto: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/119253c9/attachment-0001.html>
More information about the cfe-commits
mailing list