Skip to content

Commit

Permalink
[analyzer] Fix a couple of bugs in HTML report generation.
Browse files Browse the repository at this point in the history
It should now produce valid HTML again.

Differential Revision: https://reviews.llvm.org/D73993

(cherry picked from commit 482e236)
  • Loading branch information
haoNoQ committed Feb 6, 2020
1 parent 951d04b commit 1182868
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 1 deletion.
11 changes: 10 additions & 1 deletion clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp
Expand Up @@ -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);
Expand All @@ -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'>"
Expand Down Expand Up @@ -870,7 +879,7 @@ void HTMLDiagnostics::HandlePiece(Rewriter &R, FileID BugFileID,
<< (num - 1)
<< "\" title=\"Previous event ("
<< (num - 1)
<< ")\">&#x2190;</a></div></td>";
<< ")\">&#x2190;</a></div>";
}

os << "</td><td>";
Expand Down
31 changes: 31 additions & 0 deletions 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)">&#x2190;</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>
28 changes: 28 additions & 0 deletions 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>
29 changes: 29 additions & 0 deletions 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>
23 changes: 23 additions & 0 deletions 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>

0 comments on commit 1182868

Please sign in to comment.