Assignment.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef KLEE_UTIL_ASSIGNMENT_H
00011 #define KLEE_UTIL_ASSIGNMENT_H
00012
00013 #include <map>
00014
00015 #include "klee/util/ExprEvaluator.h"
00016
00017
00018
00019 namespace klee {
00020 class Array;
00021
00022 class Assignment {
00023 public:
00024 typedef std::map<const Array*, std::vector<unsigned char> > bindings_ty;
00025
00026 bool allowFreeValues;
00027 bindings_ty bindings;
00028
00029 public:
00030 Assignment(bool _allowFreeValues=false)
00031 : allowFreeValues(_allowFreeValues) {}
00032 Assignment(std::vector<const Array*> &objects,
00033 std::vector< std::vector<unsigned char> > &values,
00034 bool _allowFreeValues=false)
00035 : allowFreeValues(_allowFreeValues){
00036 std::vector< std::vector<unsigned char> >::iterator valIt =
00037 values.begin();
00038 for (std::vector<const Array*>::iterator it = objects.begin(),
00039 ie = objects.end(); it != ie; ++it) {
00040 const Array *os = *it;
00041 std::vector<unsigned char> &arr = *valIt;
00042 bindings.insert(std::make_pair(os, arr));
00043 ++valIt;
00044 }
00045 }
00046
00047 ref<Expr> evaluate(const Array *mo, unsigned index) const;
00048 ref<Expr> evaluate(ref<Expr> e);
00049
00050 template<typename InputIterator>
00051 bool satisfies(InputIterator begin, InputIterator end);
00052 };
00053
00054 class AssignmentEvaluator : public ExprEvaluator {
00055 const Assignment &a;
00056
00057 protected:
00058 ref<Expr> getInitialValue(const Array &mo, unsigned index) {
00059 return a.evaluate(&mo, index);
00060 }
00061
00062 public:
00063 AssignmentEvaluator(const Assignment &_a) : a(_a) {}
00064 };
00065
00066
00067
00068 inline ref<Expr> Assignment::evaluate(const Array *array,
00069 unsigned index) const {
00070 bindings_ty::const_iterator it = bindings.find(array);
00071 if (it!=bindings.end() && index<it->second.size()) {
00072 return ConstantExpr::alloc(it->second[index], Expr::Int8);
00073 } else {
00074 if (allowFreeValues) {
00075 return ReadExpr::create(UpdateList(array, true, 0),
00076 ConstantExpr::alloc(index, Expr::Int32));
00077 } else {
00078 return ConstantExpr::alloc(0, Expr::Int8);
00079 }
00080 }
00081 }
00082
00083 inline ref<Expr> Assignment::evaluate(ref<Expr> e) {
00084 AssignmentEvaluator v(*this);
00085 return v.visit(e);
00086 }
00087
00088 template<typename InputIterator>
00089 inline bool Assignment::satisfies(InputIterator begin, InputIterator end) {
00090 AssignmentEvaluator v(*this);
00091 for (; begin!=end; ++begin) {
00092 ref<Expr> res = v.visit(*begin);
00093 ConstantExpr *CE = dyn_cast<ConstantExpr>(res);
00094 if (!CE || !CE->getConstantValue())
00095 return false;
00096 }
00097 return true;
00098 }
00099 }
00100
00101 #endif