diff options
author | Anna Zaks <ganna@apple.com> | 2011-08-02 17:11:03 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2011-08-02 17:11:03 +0000 |
commit | e68b5f1fa73f8404c5d6859a3d8a139fb1da7bbb (patch) | |
tree | cfaf59187e1b44ee81b1e2014712d5f93e233060 /lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp | |
parent | a119da0761cb6b85f53857eaee50f6ad8c5ea0a0 (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.cpp | 13 |
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); } } |