summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2011-03-14 19:50:37 +0000
committerTed Kremenek <kremenek@apple.com>2011-03-14 19:50:37 +0000
commit066b226daa6839b997e934d826e5f7ac2074c826 (patch)
tree1d9cc61e78345196f0c00bf287d7f89e2e0dcb6f /clang/lib/StaticAnalyzer
parent7b635daf6e53a8acd888bdb349cf8656a4ff743b (diff)
downloadbcm5719-llvm-066b226daa6839b997e934d826e5f7ac2074c826.tar.gz
bcm5719-llvm-066b226daa6839b997e934d826e5f7ac2074c826.zip
Tweak VariadicMethodTypeChecker to only create one ExplodedNode when issuing multiple warnings for the same message expression.
Also add a test case showing that we correctly report multiple warnings for the same message expression. llvm-svn: 127605
Diffstat (limited to 'clang/lib/StaticAnalyzer')
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp18
1 files changed, 11 insertions, 7 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp b/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
index a6f980ad49d..8677f08ab9b 100644
--- a/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
@@ -502,10 +502,7 @@ public:
bool
VariadicMethodTypeChecker::isVariadicMessage(const ObjCMessage &msg) const {
const ObjCMethodDecl *MD = msg.getMethodDecl();
- if (!MD)
- return false;
-
- if (!MD->isVariadic())
+ if (!MD || !MD->isVariadic())
return false;
Selector S = msg.getSelector();
@@ -586,13 +583,19 @@ void VariadicMethodTypeChecker::checkPreObjCMessage(ObjCMessage msg,
return;
// Verify that all arguments have Objective-C types.
+ llvm::Optional<ExplodedNode*> errorNode;
+
for (unsigned I = variadicArgsBegin; I != variadicArgsEnd; ++I) {
QualType ArgTy = msg.getArgType(I);
if (ArgTy->isObjCObjectPointerType())
continue;
- ExplodedNode *N = C.generateNode();
- if (!N)
+ // Generate only one error node to use for all bug reports.
+ if (!errorNode.hasValue()) {
+ errorNode = C.generateNode();
+ }
+
+ if (!errorNode.getValue())
continue;
llvm::SmallString<128> sbuf;
@@ -607,7 +610,8 @@ void VariadicMethodTypeChecker::checkPreObjCMessage(ObjCMessage msg,
<< "' should be an Objective-C pointer type, not '"
<< ArgTy.getAsString() << "'";
- RangedBugReport *R = new RangedBugReport(*BT, os.str(), N);
+ RangedBugReport *R = new RangedBugReport(*BT, os.str(),
+ errorNode.getValue());
R->addRange(msg.getArgSourceRange(I));
C.EmitReport(R);
}
OpenPOWER on IntegriCloud