From 04a18c9f42e91db1b2d2c7483723c1cd321c3d39 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 5 Apr 2012 05:18:05 +0000 Subject: [PATCH] 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 --- lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp | 9 ++++++--- test/Analysis/CFContainers.mm | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) 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); +} -- 2.40.0