|
@@ -192,13 +192,17 @@ public:
|
|
};
|
|
};
|
|
|
|
|
|
/// Contains every contextual information needed for constructing a
|
|
/// Contains every contextual information needed for constructing a
|
|
-/// PathDiagnostic object for a given bug report. This class (and aside from
|
|
|
|
-/// some caching BugReport does in the background) and its fields are immutable,
|
|
|
|
-/// and passes a BugReportConstruct object around during the construction.
|
|
|
|
|
|
+/// PathDiagnostic object for a given bug report. This class and its fields are
|
|
|
|
+/// immutable, and passes a BugReportConstruct object around during the
|
|
|
|
+/// construction.
|
|
class PathDiagnosticBuilder : public BugReporterContext {
|
|
class PathDiagnosticBuilder : public BugReporterContext {
|
|
/// A linear path from the error node to the root.
|
|
/// A linear path from the error node to the root.
|
|
std::unique_ptr<const ExplodedGraph> BugPath;
|
|
std::unique_ptr<const ExplodedGraph> BugPath;
|
|
- BugReport *R;
|
|
|
|
|
|
+ /// The bug report we're describing. Visitors create their diagnostics with
|
|
|
|
+ /// them being the last entities being able to modify it (for example,
|
|
|
|
+ /// changing interestingness here would cause inconsistencies as to how this
|
|
|
|
+ /// file and visitors construct diagnostics), hence its const.
|
|
|
|
+ const BugReport *R;
|
|
/// The leaf of the bug path. This isn't the same as the bug reports error
|
|
/// The leaf of the bug path. This isn't the same as the bug reports error
|
|
/// node, which refers to the *original* graph, not the bug path.
|
|
/// node, which refers to the *original* graph, not the bug path.
|
|
const ExplodedNode *const ErrorNode;
|
|
const ExplodedNode *const ErrorNode;
|
|
@@ -257,7 +261,7 @@ private:
|
|
ExecutionContinues(llvm::raw_string_ostream &os,
|
|
ExecutionContinues(llvm::raw_string_ostream &os,
|
|
const PathDiagnosticConstruct &C) const;
|
|
const PathDiagnosticConstruct &C) const;
|
|
|
|
|
|
- BugReport *getBugReport() const { return R; }
|
|
|
|
|
|
+ const BugReport *getBugReport() const { return R; }
|
|
};
|
|
};
|
|
|
|
|
|
} // namespace
|
|
} // namespace
|
|
@@ -2172,14 +2176,13 @@ const Stmt *BugReport::getStmt() const {
|
|
return S;
|
|
return S;
|
|
}
|
|
}
|
|
|
|
|
|
-llvm::iterator_range<BugReport::ranges_iterator> BugReport::getRanges() {
|
|
|
|
|
|
+llvm::iterator_range<BugReport::ranges_iterator> BugReport::getRanges() const {
|
|
// If no custom ranges, add the range of the statement corresponding to
|
|
// If no custom ranges, add the range of the statement corresponding to
|
|
// the error node.
|
|
// the error node.
|
|
if (Ranges.empty()) {
|
|
if (Ranges.empty()) {
|
|
if (const auto *E = dyn_cast_or_null<Expr>(getStmt()))
|
|
if (const auto *E = dyn_cast_or_null<Expr>(getStmt()))
|
|
- addRange(E->getSourceRange());
|
|
|
|
- else
|
|
|
|
- return llvm::make_range(ranges_iterator(), ranges_iterator());
|
|
|
|
|
|
+ return llvm::make_range(&ErrorNodeRange, &ErrorNodeRange + 1);
|
|
|
|
+ return llvm::make_range(ranges_iterator(), ranges_iterator());
|
|
}
|
|
}
|
|
|
|
|
|
// User-specified absence of range info.
|
|
// User-specified absence of range info.
|