[analyzer] Fix a couple of bugs in HTML report generation.
It should now produce valid HTML again. Differential Revision: https://reviews.llvm.org/D73993
This commit is contained in:
1 parent
a328536c6d
commit
482e236e56
5 files changed
+121
-1
No files matched your search
@@ -607,10 +607,17 @@ window.addEventListener("keydown", function (event) {
|
||||
)<<<";
|
||||
}
|
||||
|
||||
static bool shouldDisplayPopUpRange(const SourceRange &Range) {
|
||||
return !(Range.getBegin().isMacroID() || Range.getEnd().isMacroID());
|
||||
}
|
||||
|
||||
static void
|
||||
HandlePopUpPieceStartTag(Rewriter &R,
|
||||
const std::vector<SourceRange> &PopUpRanges) {
|
||||
for (const auto &Range : PopUpRanges) {
|
||||
if (!shouldDisplayPopUpRange(Range))
|
||||
continue;
|
||||
|
||||
html::HighlightRange(R, Range.getBegin(), Range.getEnd(), "",
|
||||
"<table class='variable_popup'><tbody>",
|
||||
/*IsTokenRange=*/true);
|
||||
@@ -626,6 +633,8 @@ static void HandlePopUpPieceEndTag(Rewriter &R,
|
||||
llvm::raw_svector_ostream Out(Buf);
|
||||
|
||||
SourceRange Range(Piece.getLocation().asRange());
|
||||
if (!shouldDisplayPopUpRange(Range))
|
||||
return;
|
||||
|
||||
// Write out the path indices with a right arrow and the message as a row.
|
||||
Out << "<tr><td valign='top'><div class='PathIndex PathIndexPopUp'>"
|
||||
@@ -870,7 +879,7 @@ void HTMLDiagnostics::HandlePiece(Rewriter &R, FileID BugFileID,
|
||||
<< (num - 1)
|
||||
<< "\" title=\"Previous event ("
|
||||
<< (num - 1)
|
||||
<< ")\">←</a></div></td>";
|
||||
<< ")\">←</a></div>";
|
||||
}
|
||||
|
||||
os << "</td><td>";
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
// RUN: rm -fR %t
|
||||
// RUN: mkdir %t
|
||||
// RUN: %clang_analyze_cc1 -analyzer-checker=core \
|
||||
// RUN: -analyzer-output=html -o %t -verify %s
|
||||
// RUN: cat %t/report-*.html | FileCheck %s
|
||||
|
||||
void bar(int);
|
||||
|
||||
void foo() {
|
||||
int a;
|
||||
bar(a); // expected-warning{{1st function call argument is an uninitialized value}}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: <div id="EndPath" class="msg msgEvent" style="margin-left:3ex">
|
||||
// CHECK-SAME: <table class="msgT">
|
||||
// CHECK-SAME: <tr>
|
||||
// CHECK-SAME: <td valign="top">
|
||||
// CHECK-SAME: <div class="PathIndex PathIndexEvent">2</div>
|
||||
// CHECK-SAME: </td>
|
||||
// CHECK-SAME: <td>
|
||||
// CHECK-SAME: <div class="PathNav">
|
||||
// CHECK-SAME: <a href="#Path1" title="Previous event (1)">←</a>
|
||||
// CHECK-SAME: </div>
|
||||
// CHECK-SAME: </td>
|
||||
// CHECK-NOT: </td>
|
||||
// CHECK-SAME: <td>
|
||||
// CHECK-SAME: 1st function call argument is an uninitialized value
|
||||
// CHECK-SAME: </td>
|
||||
// CHECK-SAME: </tr>
|
||||
// CHECK-SAME: </table>
|
||||
// CHECK-SAME: </div>
|
||||
@@ -0,0 +1,28 @@
|
||||
// RUN: rm -fR %t
|
||||
// RUN: mkdir %t
|
||||
// RUN: %clang_analyze_cc1 -analyzer-checker=core \
|
||||
// RUN: -analyzer-output=html -o %t -verify %s
|
||||
// RUN: cat %t/report-*.html | FileCheck %s
|
||||
|
||||
void bar(int);
|
||||
|
||||
#define MACRO if (b)
|
||||
|
||||
void foo2() {
|
||||
int a;
|
||||
int b = 1;
|
||||
MACRO
|
||||
bar(a); // expected-warning{{1st function call argument is an uninitialized value}}
|
||||
}
|
||||
|
||||
// For now we don't emit popups inside macros due to UI limitations.
|
||||
// Once we do, we should test it thoroughly.
|
||||
|
||||
// CHECK-LABEL: <tr class="codeline" data-linenumber="14">
|
||||
// CHECK-NOT: <span class='variable'>
|
||||
// CHECK-SAME: <span class='macro'>
|
||||
// CHECK-SAME: MACRO
|
||||
// CHECK-SAME: <span class='macro_popup'>
|
||||
// CHECK-SAME: if (b)
|
||||
// CHECK-SAME: </span>
|
||||
// CHECK-SAME: </span>
|
||||
@@ -0,0 +1,29 @@
|
||||
// RUN: rm -fR %t
|
||||
// RUN: mkdir %t
|
||||
// RUN: %clang_analyze_cc1 -analyzer-checker=core \
|
||||
// RUN: -analyzer-output=html -o %t -verify %s
|
||||
// RUN: cat %t/report-*.html | FileCheck %s
|
||||
|
||||
void bar(int);
|
||||
|
||||
void foo() {
|
||||
int a;
|
||||
for (unsigned i = 0; i < 3; ++i)
|
||||
if (i)
|
||||
bar(a); // expected-warning{{1st function call argument is an uninitialized value}}
|
||||
}
|
||||
|
||||
// CHECK: <span class='variable'>i
|
||||
// CHECK-SAME: <table class='variable_popup'><tbody><tr>
|
||||
// CHECK-SAME: <td valign='top'>
|
||||
// CHECK-SAME: <div class='PathIndex PathIndexPopUp'>2.1</div>
|
||||
// CHECK-SAME: </td>
|
||||
// CHECK-SAME: <td>'i' is 0</td>
|
||||
// CHECK-SAME: </tr>
|
||||
// CHECK-SAME: <tr>
|
||||
// CHECK-SAME: <td valign='top'>
|
||||
// CHECK-SAME: <div class='PathIndex PathIndexPopUp'>4.1</div>
|
||||
// CHECK-SAME: </td>
|
||||
// CHECK-SAME: <td>'i' is 1</td>
|
||||
// CHECK-SAME: </tr></tbody></table>
|
||||
// CHECK-SAME: </span>
|
||||
@@ -0,0 +1,23 @@
|
||||
// RUN: rm -fR %t
|
||||
// RUN: mkdir %t
|
||||
// RUN: %clang_analyze_cc1 -analyzer-checker=core \
|
||||
// RUN: -analyzer-output=html -o %t -verify %s
|
||||
// RUN: cat %t/report-*.html | FileCheck %s
|
||||
|
||||
void bar(int);
|
||||
|
||||
void foo2() {
|
||||
int a;
|
||||
int b = 1;
|
||||
if (b)
|
||||
bar(a); // expected-warning{{1st function call argument is an uninitialized value}}
|
||||
}
|
||||
|
||||
// CHECK: <span class='variable'>b
|
||||
// CHECK-SAME: <table class='variable_popup'><tbody><tr>
|
||||
// CHECK-SAME: <td valign='top'>
|
||||
// CHECK-SAME: <div class='PathIndex PathIndexPopUp'>1.1</div>
|
||||
// CHECK-SAME: </td>
|
||||
// CHECK-SAME: <td>'b' is 1</td>
|
||||
// CHECK-SAME: </tr></tbody></table>
|
||||
// CHECK-SAME: </span>
|
||||
Reference in new issue
Block a user