[cfe-commits] r65814 - in /cfe/trunk: include/clang/Analysis/PathSensitive/Store.h lib/Analysis/GRSimpleVals.cpp lib/Analysis/RegionStore.cpp
Zhongxing Xu
xuzhongxing at gmail.com
Sun Mar 1 23:52:24 PST 2009
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");
More information about the cfe-commits
mailing list