Skip to content

Commit 5f8d361

Browse files
author
George Karpenkov
committedSep 7, 2018
[analyzer] Push updating-the-executed-lines logic into the BugReporter.
So it can be reused across different consumers. Differential Revision: https://reviews.llvm.org/D51514 llvm-svn: 341617
1 parent 98bee02 commit 5f8d361

File tree

3 files changed

+22
-21
lines changed

3 files changed

+22
-21
lines changed
 

‎clang/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -858,13 +858,13 @@ class PathDiagnostic : public llvm::FoldingSetNode {
858858
meta_iterator meta_end() const { return OtherDesc.end(); }
859859
void addMeta(StringRef s) { OtherDesc.push_back(s); }
860860

861-
using filesmap_iterator = FilesToLineNumsMap::const_iterator;
862-
863-
filesmap_iterator executedLines_begin() const {
864-
return ExecutedLines->begin();
861+
const FilesToLineNumsMap &getExecutedLines() const {
862+
return *ExecutedLines;
865863
}
866864

867-
filesmap_iterator executedLines_end() const { return ExecutedLines->end(); }
865+
FilesToLineNumsMap &getExecutedLines() {
866+
return *ExecutedLines;
867+
}
868868

869869
PathDiagnosticLocation getLocation() const {
870870
return Loc;

‎clang/lib/StaticAnalyzer/Core/BugReporter.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -1881,6 +1881,21 @@ static void dropFunctionEntryEdge(PathPieces &Path, LocationContextMap &LCM,
18811881
using VisitorsDiagnosticsTy = llvm::DenseMap<const ExplodedNode *,
18821882
std::vector<std::shared_ptr<PathDiagnosticPiece>>>;
18831883

1884+
/// Populate executes lines with lines containing at least one diagnostics.
1885+
static void updateExecutedLinesWithDiagnosticPieces(
1886+
PathDiagnostic &PD) {
1887+
1888+
PathPieces path = PD.path.flatten(/*ShouldFlattenMacros=*/true);
1889+
FilesToLineNumsMap &ExecutedLines = PD.getExecutedLines();
1890+
1891+
for (const auto &P : path) {
1892+
FullSourceLoc Loc = P->getLocation().asLocation().getExpansionLoc();
1893+
FileID FID = Loc.getFileID();
1894+
unsigned LineNo = Loc.getLineNumber();
1895+
ExecutedLines[FID.getHashValue()].insert(LineNo);
1896+
}
1897+
}
1898+
18841899
/// This function is responsible for generating diagnostic pieces that are
18851900
/// *not* provided by bug report visitors.
18861901
/// These diagnostics may differ depending on the consumer's settings,
@@ -2985,6 +3000,7 @@ void BugReporter::FlushReport(BugReportEquivClass& EQ) {
29853000
for (const auto &i : Meta)
29863001
PD->addMeta(i);
29873002

3003+
updateExecutedLinesWithDiagnosticPieces(*PD);
29883004
Consumer->HandlePathDiagnostic(std::move(PD));
29893005
}
29903006
}

‎clang/lib/StaticAnalyzer/Core/HTMLDiagnostics.cpp

+1-16
Original file line numberDiff line numberDiff line change
@@ -337,23 +337,8 @@ static void serializeExecutedLines(
337337
const PathDiagnostic &D,
338338
const PathPieces &path,
339339
llvm::raw_string_ostream &os) {
340-
// Copy executed lines from path diagnostics.
341-
std::map<unsigned, std::set<unsigned>> ExecutedLines;
342-
for (auto I = D.executedLines_begin(),
343-
E = D.executedLines_end(); I != E; ++I) {
344-
std::set<unsigned> &LinesInFile = ExecutedLines[I->first];
345-
for (unsigned LineNo : I->second) {
346-
LinesInFile.insert(LineNo);
347-
}
348-
}
349340

350-
// We need to include all lines for which any kind of diagnostics appears.
351-
for (const auto &P : path) {
352-
FullSourceLoc Loc = P->getLocation().asLocation().getExpansionLoc();
353-
FileID FID = Loc.getFileID();
354-
unsigned LineNo = Loc.getLineNumber();
355-
ExecutedLines[FID.getHashValue()].insert(LineNo);
356-
}
341+
const FilesToLineNumsMap &ExecutedLines = D.getExecutedLines();
357342

358343
os << "var relevant_lines = {";
359344
for (auto I = ExecutedLines.begin(),

0 commit comments

Comments
 (0)
Please sign in to comment.