[llvm-branch-commits] [clang] 720870e - [analyzer] Fix a couple of bugs in HTML report generation.
Hans Wennborg via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Feb 10 04:43:21 PST 2020
Author: Artem Dergachev
Date: 2020-02-10T13:41:47+01:00
New Revision: 720870ee60a2cf5259bdc5e9b2a5336381a165fc
URL: https://github.com/llvm/llvm-project/commit/720870ee60a2cf5259bdc5e9b2a5336381a165fc
DIFF: https://github.com/llvm/llvm-project/commit/720870ee60a2cf5259bdc5e9b2a5336381a165fc.diff
LOG: [analyzer] Fix a couple of bugs in HTML report generation.
It should now produce valid HTML again.
Differential Revision: https://reviews.llvm.org/D73993
(cherry picked from commit 482e236e569e8324f70778af1eb756923cd490dc)
Added:
clang/test/Analysis/html_diagnostics/td-hotfix.c
clang/test/Analysis/html_diagnostics/variable-popups-macro.c
clang/test/Analysis/html_diagnostics/variable-popups-multiple.c
clang/test/Analysis/html_diagnostics/variable-popups-simple.c
Modified:
clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
Removed:
################################################################################
diff --git a/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp b/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
index a4918d7179ff..002b6070ddcd 100644
--- a/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
+++ b/clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
@@ -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>";
diff --git a/clang/test/Analysis/html_diagnostics/td-hotfix.c b/clang/test/Analysis/html_diagnostics/td-hotfix.c
new file mode 100644
index 000000000000..8595642ad0f5
--- /dev/null
+++ b/clang/test/Analysis/html_diagnostics/td-hotfix.c
@@ -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>
diff --git a/clang/test/Analysis/html_diagnostics/variable-popups-macro.c b/clang/test/Analysis/html_diagnostics/variable-popups-macro.c
new file mode 100644
index 000000000000..83bda14d4f2f
--- /dev/null
+++ b/clang/test/Analysis/html_diagnostics/variable-popups-macro.c
@@ -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>
diff --git a/clang/test/Analysis/html_diagnostics/variable-popups-multiple.c b/clang/test/Analysis/html_diagnostics/variable-popups-multiple.c
new file mode 100644
index 000000000000..d7a05b53e4f5
--- /dev/null
+++ b/clang/test/Analysis/html_diagnostics/variable-popups-multiple.c
@@ -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>
diff --git a/clang/test/Analysis/html_diagnostics/variable-popups-simple.c b/clang/test/Analysis/html_diagnostics/variable-popups-simple.c
new file mode 100644
index 000000000000..cb2f3bf3226d
--- /dev/null
+++ b/clang/test/Analysis/html_diagnostics/variable-popups-simple.c
@@ -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>
More information about the llvm-branch-commits
mailing list