diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-11-22 13:21:46 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-11-22 13:21:46 +0000 |
commit | e8a964bdb46349e4fa3433c8e5104d2a0f7f5c65 (patch) | |
tree | 7ee508e61cd1fd98e1e3412e54bcd037104ad779 /lib/Analysis/BasicConstraintManager.cpp | |
parent | 254be6ac14092e0bdd9e632dfea09f237850e63d (diff) |
Initial support for checking out of bound memory access. Only support
ConcreteInt index for now.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59869 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BasicConstraintManager.cpp')
-rw-r--r-- | lib/Analysis/BasicConstraintManager.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/Analysis/BasicConstraintManager.cpp b/lib/Analysis/BasicConstraintManager.cpp index b09d9de446..a359b23c54 100644 --- a/lib/Analysis/BasicConstraintManager.cpp +++ b/lib/Analysis/BasicConstraintManager.cpp @@ -69,6 +69,9 @@ public: const GRState* AssumeSymLE(const GRState* St, SymbolID sym, const llvm::APSInt& V, bool& isFeasible); + const GRState* AssumeInBound(const GRState* St, SVal Idx, SVal UpperBound, + bool Assumption, bool& isFeasible); + const GRState* AddEQ(const GRState* St, SymbolID sym, const llvm::APSInt& V); const GRState* AddNE(const GRState* St, SymbolID sym, const llvm::APSInt& V); @@ -83,6 +86,9 @@ public: void print(const GRState* St, std::ostream& Out, const char* nl, const char *sep); + +private: + BasicValueFactory& getBasicVals() { return StateMgr.getBasicVals(); } }; } // end anonymous namespace @@ -352,6 +358,27 @@ BasicConstraintManager::AssumeSymLE(const GRState* St, SymbolID sym, return St; } +const GRState* +BasicConstraintManager::AssumeInBound(const GRState* St, SVal Idx, + SVal UpperBound, bool Assumption, + bool& isFeasible) { + // Only support ConcreteInt for now. + if (!(isa<nonloc::ConcreteInt>(Idx) && isa<nonloc::ConcreteInt>(UpperBound))){ + isFeasible = true; + return St; + } + + const llvm::APSInt& Zero = getBasicVals().getZeroWithPtrWidth(false); + const llvm::APSInt& IdxV = cast<nonloc::ConcreteInt>(Idx).getValue(); + const llvm::APSInt& UBV = cast<nonloc::ConcreteInt>(UpperBound).getValue(); + + bool InBound = (Zero <= IdxV) && (IdxV < UBV); + + isFeasible = Assumption ? InBound : !InBound; + + return St; +} + static int ConstEqTyIndex = 0; static int ConstNotEqTyIndex = 0; |