diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-10-01 19:07:22 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-10-01 19:07:22 +0000 |
commit | e606e3d224d3fa8f6d4358ec66858d46754457a0 (patch) | |
tree | 825b63dc7a9543df5cb87c6c8fc31b2e83f9d28e /lib/StaticAnalyzer/Core/ExprEngineObjC.cpp | |
parent | 75c5e6df52e055537cf92687cf80fe644233381f (diff) |
[analyzer] Allow ObjC ivar lvalues where the base is nil.
By analogy with C structs, this seems to be legal, if probably discouraged.
It's only if the ivar is read from or written to that there's a problem.
Running a program that gets the "address" of an instance variable does in
fact return the offset when the base "object" is nil.
This isn't a full revert because r164442 includes some diagnostic tweaks
as well; those have been kept.
This partially reverts r164442 / 08965091770c9b276c238bac2f716eaa4da2dca4.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164960 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core/ExprEngineObjC.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/ExprEngineObjC.cpp | 14 |
1 files changed, 2 insertions, 12 deletions
diff --git a/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp b/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp index ee315a4604..51dda19b53 100644 --- a/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp @@ -25,21 +25,11 @@ void ExprEngine::VisitLvalObjCIvarRefExpr(const ObjCIvarRefExpr *Ex, ProgramStateRef state = Pred->getState(); const LocationContext *LCtx = Pred->getLocationContext(); SVal baseVal = state->getSVal(Ex->getBase(), LCtx); - - // First check that the base object is valid. - ExplodedNodeSet DstLoc; - evalLocation(DstLoc, Ex, Ex, Pred, state, baseVal, - /*Tag=*/0, /*isLoad=*/true); - - // Bind the lvalue to the expression. SVal location = state->getLValue(Ex->getDecl(), baseVal); ExplodedNodeSet dstIvar; - StmtNodeBuilder Bldr(DstLoc, dstIvar, *currBldrCtx); - for (ExplodedNodeSet::iterator I = DstLoc.begin(), E = DstLoc.end(); - I != E; ++I) { - Bldr.generateNode(Ex, (*I), (*I)->getState()->BindExpr(Ex, LCtx, location)); - } + StmtNodeBuilder Bldr(Pred, dstIvar, *currBldrCtx); + Bldr.generateNode(Ex, Pred, state->BindExpr(Ex, LCtx, location)); // Perform the post-condition check of the ObjCIvarRefExpr and store // the created nodes in 'Dst'. |