[static analyzer] Tweak RetainCountChecker's diagnostics to correctly indicate if a message was due to a property access. This can

potentially be refactored for other clients, and this is a regression from the refactoring of property acceses.

llvm-svn: 144571
This commit is contained in:
Ted Kremenek 2011-11-14 21:59:21 +00:00
parent f2fc508d4d
commit 8e7fbcc3e4
2 changed files with 20 additions and 5 deletions

View File

@ -18,6 +18,7 @@
#include "clang/Basic/LangOptions.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Analysis/DomainSpecific/CocoaConventions.h"
#include "clang/AST/ParentMap.h"
#include "clang/StaticAnalyzer/Core/Checker.h"
#include "clang/StaticAnalyzer/Core/CheckerManager.h"
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
@ -1815,6 +1816,20 @@ static inline bool contains(const SmallVectorImpl<ArgEffect>& V,
return false;
}
static bool isPropertyAccess(const Stmt *S, ParentMap &PM) {
unsigned maxDepth = 4;
while (S && maxDepth) {
if (const PseudoObjectExpr *PO = dyn_cast<PseudoObjectExpr>(S)) {
if (!isa<ObjCMessageExpr>(PO->getSyntacticForm()))
return true;
return false;
}
S = PM.getParent(S);
--maxDepth;
}
return false;
}
PathDiagnosticPiece *CFRefReportVisitor::VisitNode(const ExplodedNode *N,
const ExplodedNode *PrevN,
BugReporterContext &BRC,
@ -1851,10 +1866,11 @@ PathDiagnosticPiece *CFRefReportVisitor::VisitNode(const ExplodedNode *N,
else
os << "function call";
}
else if (isa<ObjCMessageExpr>(S)) {
os << "Method";
} else {
os << "Property";
else {
assert(isa<ObjCMessageExpr>(S));
// The message expression may have between written directly or as
// a property access. Lazily determine which case we are looking at.
os << (isPropertyAccess(S, N->getParentMap()) ? "Property" : "Method");
}
if (CurrV.getObjKind() == RetEffect::CF) {

View File

@ -3,7 +3,6 @@
// This actually still works after the pseudo-object refactor, it just
// uses messages that say 'method' instead of 'property'. Ted wanted
// this xfailed and filed as a bug. rdar://problem/10402993
// XFAIL: *
/***
This file is for testing the path-sensitive notes for retain/release errors.