Test case please. On Mar 1, 2009, at 11:52 PM, Zhongxing Xu wrote:
> Author: zhongxingxu > Date: Mon Mar 2 01:52:23 2009 > New Revision: 65814 > > URL: http://llvm.org/viewvc/llvm-project?rev=65814&view=rev > Log: > Initial support for pointer arithmetic. Only support concrete > indexes and > offsets for now. > > Modified: > cfe/trunk/include/clang/Analysis/PathSensitive/Store.h > cfe/trunk/lib/Analysis/GRSimpleVals.cpp > cfe/trunk/lib/Analysis/RegionStore.cpp > > Modified: cfe/trunk/include/clang/Analysis/PathSensitive/Store.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/Store.h?rev=65814&r1=65813&r2=65814&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- cfe/trunk/include/clang/Analysis/PathSensitive/Store.h (original) > +++ cfe/trunk/include/clang/Analysis/PathSensitive/Store.h Mon Mar > 2 01:52:23 2009 > @@ -112,6 +112,11 @@ > /// casted and 'CastToTy' the result type of the cast. > virtual CastResult CastRegion(const GRState* state, const > MemRegion* R, > QualType CastToTy) = 0; > + > + /// EvalBinOp - Perform pointer arithmetic. > + virtual SVal EvalBinOp(BinaryOperator::Opcode Op, Loc L, NonLoc > R) { > + return UnknownVal(); > + } > > /// getSelfRegion - Returns the region for the 'self' (Objective- > C) or > /// 'this' object (C++). When used when analyzing a normal > function this > > Modified: cfe/trunk/lib/Analysis/GRSimpleVals.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRSimpleVals.cpp?rev=65814&r1=65813&r2=65814&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- cfe/trunk/lib/Analysis/GRSimpleVals.cpp (original) > +++ cfe/trunk/lib/Analysis/GRSimpleVals.cpp Mon Mar 2 01:52:23 2009 > @@ -265,7 +265,8 @@ > > SVal GRSimpleVals::EvalBinOp(GRExprEngine& Eng, > BinaryOperator::Opcode Op, > Loc L, NonLoc R) { > - return UnknownVal(); > + // Delegate pointer arithmetic to store manager. > + return Eng.getStoreManager().EvalBinOp(Op, L, R); > } > > // Equality operators for Locs. > > Modified: cfe/trunk/lib/Analysis/RegionStore.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/RegionStore.cpp?rev=65814&r1=65813&r2=65814&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- cfe/trunk/lib/Analysis/RegionStore.cpp (original) > +++ cfe/trunk/lib/Analysis/RegionStore.cpp Mon Mar 2 01:52:23 2009 > @@ -170,6 +170,8 @@ > CastResult CastRegion(const GRState* state, const MemRegion* R, > QualType CastToTy); > > + SVal EvalBinOp(BinaryOperator::Opcode Op, Loc L, NonLoc R); > + > /// The high level logic for this method is this: > /// Retrieve (L) > /// if L has binding > @@ -551,6 +553,33 @@ > return CastResult(AddRegionView(state, ViewR, R), ViewR); > } > > +SVal RegionStoreManager::EvalBinOp(BinaryOperator::Opcode Op, Loc > L, NonLoc R) { > + // Assume the base location is MemRegionVal(ElementRegion). > + > + if (!isa<loc::MemRegionVal>(L)) { > + return UnknownVal(); > + } > + > + const MemRegion* MR = cast<loc::MemRegionVal>(L).getRegion(); > + > + const ElementRegion* ER = cast<ElementRegion>(MR); > + SVal Idx = ER->getIndex(); > + > + nonloc::ConcreteInt* Base = dyn_cast<nonloc::ConcreteInt>(&Idx); > + nonloc::ConcreteInt* Offset = dyn_cast<nonloc::ConcreteInt>(&R); > + > + // Only support concrete integer indexes for now. > + if (Base && Offset) { > + SVal NewIdx = Base->EvalBinOp(getBasicVals(), Op, *Offset); > + > + const MemRegion* NewER = MRMgr.getElementRegion(NewIdx, > + ER- > >getArrayRegion()); > + return Loc::MakeVal(NewER); > + > + } else > + return UnknownVal(); > +} > + > SVal RegionStoreManager::Retrieve(const GRState* St, Loc L, QualType > T) { > assert(!isa<UnknownVal>(L) && "location unknown"); > assert(!isa<UndefinedVal>(L) && "location undefined"); > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
