From: Zhongxing Xu Date: Tue, 19 Jan 2010 09:25:53 +0000 (+0000) Subject: Fix a serious bug: Tmp3 is the wrong destination set. We should create a new X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c39b2bdd4cef51021fe90de91c9fb6d1a15f4d0a;p=clang Fix a serious bug: Tmp3 is the wrong destination set. We should create a new intermediate destination set Tmp4. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93873 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/PathSensitive/CheckerVisitor.h b/include/clang/Analysis/PathSensitive/CheckerVisitor.h index f5145bbb7a..37ec8def50 100644 --- a/include/clang/Analysis/PathSensitive/CheckerVisitor.h +++ b/include/clang/Analysis/PathSensitive/CheckerVisitor.h @@ -66,6 +66,11 @@ break; default: assert(false && "Unsupport statement."); return; + case Stmt::CompoundAssignOperatorClass: + static_cast(this)->PostVisitBinaryOperator(C, + static_cast(S)); + break; + #define POSTVISIT(NAME, FALLBACK) \ case Stmt::NAME ## Class:\ static_cast(this)->\ diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 40c12c9fec..b2229a268c 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -2952,13 +2952,13 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B, // Perform a load (the LHS). This performs the checks for // null dereferences, and so on. - ExplodedNodeSet Tmp3; + ExplodedNodeSet Tmp4; SVal location = state->getSVal(LHS); - EvalLoad(Tmp3, LHS, *I2, state, location); + EvalLoad(Tmp4, LHS, *I2, state, location); - for (ExplodedNodeSet::iterator I3=Tmp3.begin(), E3=Tmp3.end(); I3!=E3; - ++I3) { - state = GetState(*I3); + for (ExplodedNodeSet::iterator I4=Tmp4.begin(), E4=Tmp4.end(); I4!=E4; + ++I4) { + state = GetState(*I4); SVal V = state->getSVal(LHS); // Get the computation type. @@ -3008,7 +3008,7 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B, llvm::tie(state, LHSVal) = SVator.EvalCast(Result, state, LTy, CTy); } - EvalStore(Tmp3, B, LHS, *I3, state->BindExpr(B, Result), + EvalStore(Tmp3, B, LHS, *I4, state->BindExpr(B, Result), location, LHSVal); } }