const ExplodedNode *ErrorNode = nullptr;
SmallVector<SourceRange, 4> Ranges;
+ const SourceRange ErrorNodeRange;
ExtraTextList ExtraText;
NoteList Notes;
llvm::SmallSet<const ExplodedNode *, 4> TrackedConditions;
public:
- BugReport(const BugType& bt, StringRef desc, const ExplodedNode *errornode)
- : BT(bt), Description(desc), ErrorNode(errornode) {}
+ BugReport(const BugType &bt, StringRef desc, const ExplodedNode *errornode)
+ : BT(bt), Description(desc), ErrorNode(errornode),
+ ErrorNodeRange(getStmt() ? getStmt()->getSourceRange()
+ : SourceRange()) {}
- BugReport(const BugType& bt, StringRef shortDesc, StringRef desc,
+ BugReport(const BugType &bt, StringRef shortDesc, StringRef desc,
const ExplodedNode *errornode)
: BT(bt), ShortDescription(shortDesc), Description(desc),
- ErrorNode(errornode) {}
+ ErrorNode(errornode),
+ ErrorNodeRange(getStmt() ? getStmt()->getSourceRange()
+ : SourceRange()) {}
BugReport(const BugType &bt, StringRef desc, PathDiagnosticLocation l)
- : BT(bt), Description(desc), Location(l) {}
+ : BT(bt), Description(desc), Location(l),
+ ErrorNodeRange(getStmt() ? getStmt()->getSourceRange()
+ : SourceRange()) {}
/// Create a BugReport with a custom uniqueing location.
///
}
/// Get the SourceRanges associated with the report.
- virtual llvm::iterator_range<ranges_iterator> getRanges();
+ virtual llvm::iterator_range<ranges_iterator> getRanges() const;
/// Add custom or predefined bug report visitors to this report.
///
/// Generates the default final diagnostic piece.
static PathDiagnosticPieceRef getDefaultEndPath(const BugReporterContext &BRC,
const ExplodedNode *N,
- BugReport &BR);
+ const BugReport &BR);
};
/// Finds last store into the given region,
ExplodedNode *n, SymbolRef sym,
StringRef endText);
- llvm::iterator_range<ranges_iterator> getRanges() override {
+ llvm::iterator_range<ranges_iterator> getRanges() const override {
if (!isLeak)
return BugReport::getRanges();
return llvm::make_range(ranges_iterator(), ranges_iterator());
};
/// 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 {
/// A linear path from the error node to the root.
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
/// node, which refers to the *original* graph, not the bug path.
const ExplodedNode *const ErrorNode;
ExecutionContinues(llvm::raw_string_ostream &os,
const PathDiagnosticConstruct &C) const;
- BugReport *getBugReport() const { return R; }
+ const BugReport *getBugReport() const { return R; }
};
} // namespace
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
// the error node.
if (Ranges.empty()) {
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.
PathDiagnosticPieceRef
BugReporterVisitor::getDefaultEndPath(const BugReporterContext &BRC,
const ExplodedNode *EndPathNode,
- BugReport &BR) {
+ const BugReport &BR) {
PathDiagnosticLocation L = PathDiagnosticLocation::createEndOfPath(
EndPathNode, BRC.getSourceManager());