From: Ted Kremenek Date: Thu, 5 Apr 2012 05:18:05 +0000 (+0000) Subject: Teach ObjCContainersChecker that the array passed to CFArrayGetValueAtIndex might... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=04a18c9f42e91db1b2d2c7483723c1cd321c3d39;p=clang Teach ObjCContainersChecker that the array passed to CFArrayGetValueAtIndex might not be a symbolic value. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154083 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp b/lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp index 69e8fbb7ab..207d65ad8f 100644 --- a/lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp @@ -40,7 +40,6 @@ class ObjCContainersChecker : public Checker< check::PreStmt, inline SymbolRef getArraySym(const Expr *E, CheckerContext &C) const { SVal ArrayRef = C.getState()->getSVal(E, C.getLocationContext()); SymbolRef ArraySym = ArrayRef.getAsSymbol(); - assert(ArraySym); return ArraySym; } @@ -120,8 +119,12 @@ void ObjCContainersChecker::checkPreStmt(const CallExpr *CE, // Retrieve the size. // Find out if we saw this array symbol before and have information about it. const Expr *ArrayExpr = CE->getArg(0); - const DefinedSVal *Size = - State->get(getArraySym(ArrayExpr, C)); + SymbolRef ArraySym = getArraySym(ArrayExpr, C); + if (!ArraySym) + return; + + const DefinedSVal *Size = State->get(ArraySym); + if (!Size) return; diff --git a/test/Analysis/CFContainers.mm b/test/Analysis/CFContainers.mm index e8166eba8d..7d6c175d1f 100644 --- a/test/Analysis/CFContainers.mm +++ b/test/Analysis/CFContainers.mm @@ -198,3 +198,7 @@ void TestConst(CFArrayRef A, CFIndex sIndex, void* x[]) { const void *s1 = CFArrayGetValueAtIndex(B, 2); } + +void TestNullArray() { + CFArrayGetValueAtIndex(0, 0); +}