From 0752a5dff3b82f4d663c983abae5b3667b5c7f6e Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 22 Apr 2009 18:16:20 +0000 Subject: [PATCH] BugReporter (extensive diagnostic algorithm): The initial control-flow edge now starts from the first character of the first statement. llvm-svn: 69813 --- clang/lib/Analysis/BugReporter.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/clang/lib/Analysis/BugReporter.cpp b/clang/lib/Analysis/BugReporter.cpp index 7e7132aaab70..33ff12d17eed 100644 --- a/clang/lib/Analysis/BugReporter.cpp +++ b/clang/lib/Analysis/BugReporter.cpp @@ -796,8 +796,9 @@ class VISIBILITY_HIDDEN EdgeBuilder { public: EdgeBuilder(PathDiagnostic &pd, PathDiagnosticBuilder &pdb) : PD(pd), PDB(pdb) { - CLocs.push_back(PathDiagnosticLocation(&PDB.getCodeDecl(), - PDB.getSourceManager())); + + // If the PathDiagnostic already has pieces, add the enclosing statement + // of the first piece as a context as well. if (!PD.empty()) { PrevLoc = PD.begin()->getLocation(); @@ -808,6 +809,15 @@ public: ~EdgeBuilder() { while (!CLocs.empty()) popLocation(); + + // Finally, add an initial edge from the start location of the first + // statement (if it doesn't already exist). + if (const CompoundStmt *CS = PDB.getCodeDecl().getBody(PDB.getContext())) + if (!CS->body_empty()) { + SourceLocation Loc = (*CS->body_begin())->getLocStart(); + rawAddEdge(PathDiagnosticLocation(Loc, PDB.getSourceManager())); + } + } void addEdge(PathDiagnosticLocation NewLoc, bool alwaysAdd = false); @@ -907,6 +917,10 @@ void EdgeBuilder::rawAddEdge(PathDiagnosticLocation NewLoc) { } void EdgeBuilder::addEdge(PathDiagnosticLocation NewLoc, bool alwaysAdd) { + + if (!alwaysAdd && NewLoc.asLocation().isMacroID()) + return; + const PathDiagnosticLocation &CLoc = getContextLocation(NewLoc); while (!CLocs.empty()) {