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
This commit is contained in:
Ted Kremenek 2012-04-05 05:18:05 +00:00
Родитель bb3d20f80c
Коммит 04a18c9f42
2 изменённых файлов: 10 добавлений и 3 удалений

Просмотреть файл

@ -40,7 +40,6 @@ class ObjCContainersChecker : public Checker< check::PreStmt<CallExpr>,
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<ArraySizeMap>(getArraySym(ArrayExpr, C));
SymbolRef ArraySym = getArraySym(ArrayExpr, C);
if (!ArraySym)
return;
const DefinedSVal *Size = State->get<ArraySizeMap>(ArraySym);
if (!Size)
return;

Просмотреть файл

@ -198,3 +198,7 @@ void TestConst(CFArrayRef A, CFIndex sIndex, void* x[]) {
const void *s1 = CFArrayGetValueAtIndex(B, 2);
}
void TestNullArray() {
CFArrayGetValueAtIndex(0, 0);
}