diff options
| author | Ted Kremenek <kremenek@apple.com> | 2009-11-21 00:49:41 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2009-11-21 00:49:41 +0000 |
| commit | f7adea43b4fc35da29bac39e31bf81e2e2f597e6 (patch) | |
| tree | b4ad3399cb6cb47cc5a2aaabaaf12a68a993827b /clang/lib/Analysis/UndefinedArgChecker.cpp | |
| parent | 92e8c655b2fc8685fecaba2575284c82d9ac74d3 (diff) | |
| download | bcm5719-llvm-f7adea43b4fc35da29bac39e31bf81e2e2f597e6.tar.gz bcm5719-llvm-f7adea43b4fc35da29bac39e31bf81e2e2f597e6.zip | |
More checker refactoring. Passing undefined values in a message expression is now handled by UndefinedArgChecker.
llvm-svn: 89519
Diffstat (limited to 'clang/lib/Analysis/UndefinedArgChecker.cpp')
| -rw-r--r-- | clang/lib/Analysis/UndefinedArgChecker.cpp | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/clang/lib/Analysis/UndefinedArgChecker.cpp b/clang/lib/Analysis/UndefinedArgChecker.cpp index 923a7e1bed0..a0c0d487129 100644 --- a/clang/lib/Analysis/UndefinedArgChecker.cpp +++ b/clang/lib/Analysis/UndefinedArgChecker.cpp @@ -21,14 +21,16 @@ using namespace clang; namespace { class VISIBILITY_HIDDEN UndefinedArgChecker : public CheckerVisitor<UndefinedArgChecker> { - BugType *BT; + BugType *BT_call; + BugType *BT_msg; public: - UndefinedArgChecker() : BT(0) {} + UndefinedArgChecker() : BT_call(0), BT_msg(0) {} static void *getTag() { static int x = 0; return &x; } void PreVisitCallExpr(CheckerContext &C, const CallExpr *CE); + void PreVisitObjCMessageExpr(CheckerContext &C, const ObjCMessageExpr *ME); }; } // end anonymous namespace @@ -42,14 +44,40 @@ void UndefinedArgChecker::PreVisitCallExpr(CheckerContext &C, I != E; ++I) { if (C.getState()->getSVal(*I).isUndef()) { if (ExplodedNode *N = C.GenerateNode(CE, true)) { - if (!BT) - BT = new BuiltinBug("Pass-by-value argument in function call is " - "undefined"); + if (!BT_call) + BT_call = new BuiltinBug("Pass-by-value argument in function call is " + "undefined"); // Generate a report for this bug. - EnhancedBugReport *R = new EnhancedBugReport(*BT, BT->getName(), N); + EnhancedBugReport *R = new EnhancedBugReport(*BT_call, + BT_call->getName(), N); R->addRange((*I)->getSourceRange()); R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, *I); C.EmitReport(R); + return; + } + } + } +} + +void UndefinedArgChecker::PreVisitObjCMessageExpr(CheckerContext &C, + const ObjCMessageExpr *ME) { + + // Check for any arguments that are uninitialized/undefined. + const GRState *state = C.getState(); + for (ObjCMessageExpr::const_arg_iterator I = ME->arg_begin(), E = ME->arg_end(); + I != E; ++I) { + if (state->getSVal(*I).isUndef()) { + if (ExplodedNode *N = C.GenerateNode(ME, true)) { + if (!BT_msg) + BT_msg = new BuiltinBug("Pass-by-value argument in message expression" + " is undefined"); + // Generate a report for this bug. + EnhancedBugReport *R = new EnhancedBugReport(*BT_msg, BT_msg->getName(), + N); + R->addRange((*I)->getSourceRange()); + R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, *I); + C.EmitReport(R); + return; } } } |

