aboutsummaryrefslogtreecommitdiff
path: root/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
diff options
context:
space:
mode:
authorAnna Zaks <ganna@apple.com>2011-08-02 17:11:03 +0000
committerAnna Zaks <ganna@apple.com>2011-08-02 17:11:03 +0000
commite68b5f1fa73f8404c5d6859a3d8a139fb1da7bbb (patch)
treecfaf59187e1b44ee81b1e2014712d5f93e233060 /lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
parenta119da0761cb6b85f53857eaee50f6ad8c5ea0a0 (diff)
KeychainAPI checker: only check the paths on which the allocator function returned noErr. (+ minor cleanup)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136694 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp')
-rw-r--r--lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp b/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
index 3e80d9cc42..f9a43fdc3a 100644
--- a/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
@@ -119,10 +119,21 @@ void MacOSKeychainAPIChecker::checkPostStmt(const CallExpr *CE,
if (idx != InvalidParamVal) {
SVal Param = State->getSVal(CE->getArg(idx));
if (const loc::MemRegionVal *X = dyn_cast<loc::MemRegionVal>(&Param)) {
- SymbolRef V = SM.Retrieve (State->getStore(), *X).getAsSymbol();
+ // Add the symbolic value, which represents the location of the allocated
+ // data, to the set.
+ SymbolRef V = SM.Retrieve(State->getStore(), *X).getAsSymbol();
if (!V)
return;
State = State->add<AllocatedData>(V);
+
+ // We only need to track the value if the function returned noErr(0), so
+ // bind the return value of the function to 0.
+ SValBuilder &Builder = C.getSValBuilder();
+ SVal ZeroVal = Builder.makeZeroVal(Builder.getContext().CharTy);
+ State = State->BindExpr(CE, ZeroVal);
+ assert(State);
+
+ // Proceed from the new state.
C.addTransition(State);
}
}