diff options
author | Anna Zaks <ganna@apple.com> | 2015-02-05 01:02:56 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2015-02-05 01:02:56 +0000 |
commit | 33f0632640b97d1f041f43a6f64f5f08aba55b40 (patch) | |
tree | 9b02c27fda3f92ed88df3a5a839bdba0af9ed948 /clang/lib/StaticAnalyzer | |
parent | 486a0ff4b79bb79cbd12c4fd34cf2b816d62bc12 (diff) | |
download | bcm5719-llvm-33f0632640b97d1f041f43a6f64f5f08aba55b40.tar.gz bcm5719-llvm-33f0632640b97d1f041f43a6f64f5f08aba55b40.zip |
[analyzer] Do not crash in the KeychainAPI checker on user defined 'free()'.
llvm-svn: 228248
Diffstat (limited to 'clang/lib/StaticAnalyzer')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp index ee019564112..0d731605b70 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp @@ -292,7 +292,11 @@ void MacOSKeychainAPIChecker::checkPreStmt(const CallExpr *CE, // If it is a call to an allocator function, it could be a double allocation. idx = getTrackedFunctionIndex(funName, true); if (idx != InvalidIdx) { - const Expr *ArgExpr = CE->getArg(FunctionsToTrack[idx].Param); + unsigned paramIdx = FunctionsToTrack[idx].Param; + if (CE->getNumArgs() <= paramIdx) + return; + + const Expr *ArgExpr = CE->getArg(paramIdx); if (SymbolRef V = getAsPointeeSymbol(ArgExpr, C)) if (const AllocationState *AS = State->get<AllocatedData>(V)) { if (!definitelyReturnedError(AS->Region, State, C.getSValBuilder())) { @@ -325,8 +329,12 @@ void MacOSKeychainAPIChecker::checkPreStmt(const CallExpr *CE, if (idx == InvalidIdx) return; + unsigned paramIdx = FunctionsToTrack[idx].Param; + if (CE->getNumArgs() <= paramIdx) + return; + // Check the argument to the deallocator. - const Expr *ArgExpr = CE->getArg(FunctionsToTrack[idx].Param); + const Expr *ArgExpr = CE->getArg(paramIdx); SVal ArgSVal = State->getSVal(ArgExpr, C.getLocationContext()); // Undef is reported by another checker. |