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 | 64fa85855638d69e56ed1b2fad7ed65deb3ecdfd (patch) | |
tree | e36a30cd73b3e01dfac5715112ae8e16bd2967f0 /lib/Analysis/UndefinedArgChecker.cpp | |
parent | 75ee3bd6e7ed2b4286d5e717ae7b94411f90b3b9 (diff) |
More checker refactoring. Passing undefined values in a message expression is now handled by UndefinedArgChecker.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89519 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/UndefinedArgChecker.cpp')
-rw-r--r-- | lib/Analysis/UndefinedArgChecker.cpp | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/lib/Analysis/UndefinedArgChecker.cpp b/lib/Analysis/UndefinedArgChecker.cpp index 923a7e1bed..a0c0d48712 100644 --- a/lib/Analysis/UndefinedArgChecker.cpp +++ b/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; } } } |