diff options
| author | Ted Kremenek <kremenek@apple.com> | 2011-03-14 19:50:37 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2011-03-14 19:50:37 +0000 |
| commit | 066b226daa6839b997e934d826e5f7ac2074c826 (patch) | |
| tree | 1d9cc61e78345196f0c00bf287d7f89e2e0dcb6f /clang/lib/StaticAnalyzer | |
| parent | 7b635daf6e53a8acd888bdb349cf8656a4ff743b (diff) | |
| download | bcm5719-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.cpp | 18 |
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); } |

