92 "We just excluded this case");
104 "We just excluded that case");
202 "Zero should be between a negative and a positive value");
246 "If an interval contains zero its lower bound can't be positive"
247 " and its upper bound can't be negative");
498 std::vector<exprt> values,
504 if(values.size() == 0)
509 if(values.size() == 1)
511 return *(values.begin());
514 if(values.size() == 2)
518 return get_min(values.front(), values.back());
522 return get_max(values.front(), values.back());
530 if((min_value &&
is_min(v)) || (!min_value &&
is_max(v)))
536 for(
auto left : values)
540 for(
auto right : values)
582 else if(operation ==
ID_div)
586 else if(operation ==
ID_mod)
628 "We ruled out extreme cases beforehand");
727 is_signed(
rhs),
"We think this is a signed integer for some reason?");
733 "We ruled out extreme cases beforehand");
787 "We ruled out extreme values beforehand");
932 "We ruled out extreme cases beforehand");
1002 "The value created from 0 should be zero or false");
1288 is_signed(expr),
"We don't support anything other than integers yet");
1326 "Best we can do now is a==b?, but this is covered by the above, so "
1390 "These cases should have all been handled before this point");
1400 "We have excluded all of these cases in the code above");
1438 std::stringstream out;
1550 return lhs.
minus(rhs);
1617 return a.unary_plus();
1623 return a.unary_minus();
1684 return a.multiply(
b);
1706 return a.left_shift(
b);
1713 return a.right_shift(
b);
1720 return a.bitwise_not();
1728 return a.bitwise_xor(
b);
1735 return a.bitwise_or(
b);
1742 return a.bitwise_and(
b);
1749 return a.less_than(
b);
1756 return a.greater_than(
b);
1763 return a.less_than_or_equal(
b);
1770 return a.greater_than_or_equal(
b);
1790 return a.increment();
1796 return a.decrement();
1801 return a.is_empty();
1807 return a.is_single_value_interval();
1817 return a.is_bottom();
1822 return a.has_no_lower_bound();
1827 return a.has_no_upper_bound();
1832 for(
const auto &op : expr.
operands())
1839 if(op.has_operands())
1932 return a.is_definitely_true();
1937 return a.is_definitely_false();
1944 return a.logical_and(
b);
1951 return a.logical_or(
b);
1958 return a.logical_xor(
b);
1963 return a.logical_not();
1972 else if(
val.is_false())
API to expression classes for bitvectors.
const c_bit_field_typet & to_c_bit_field_type(const typet &type)
Cast a typet to a c_bit_field_typet.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
A base class for binary expressions.
A base class for relations, i.e., binary predicates whose two operands have the same type.
A constant literal expression.
Represents an interval of values.
static constant_interval_exprt get_extremes(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs, const irep_idt &operation)
max_value_exprt max() const
static exprt generate_division_expression(const exprt &lhs, const exprt &rhs)
static bool is_bottom(const constant_interval_exprt &a)
constant_interval_exprt bottom() const
constant_interval_exprt minus(const constant_interval_exprt &other) const
tvt greater_than_or_equal(const constant_interval_exprt &o) const
min_value_exprt min() const
tvt greater_than(const constant_interval_exprt &o) const
constant_interval_exprt bitwise_or(const constant_interval_exprt &o) const
constant_interval_exprt decrement() const
tvt less_than_or_equal(const constant_interval_exprt &o) const
tvt is_definitely_false() const
constant_interval_exprt left_shift(const constant_interval_exprt &o) const
tvt not_equal(const constant_interval_exprt &o) const
static exprt generate_shift_expression(const exprt &lhs, const exprt &rhs, const irep_idt &operation)
bool has_no_upper_bound() const
constant_interval_exprt typecast(const typet &type) const
constant_interval_exprt multiply(const constant_interval_exprt &o) const
static constant_interval_exprt tvt_to_interval(const tvt &val)
constant_interval_exprt unary_plus() const
constant_interval_exprt plus(const constant_interval_exprt &o) const
static exprt get_extreme(std::vector< exprt > values, bool min=true)
static void append_multiply_expression(const exprt &lower, const exprt &upper, std::vector< exprt > &collection)
Adds all possible values that may arise from multiplication (more than one, in case of past the type ...
constant_interval_exprt bitwise_xor(const constant_interval_exprt &o) const
bool is_single_value_interval() const
constant_interval_exprt increment() const
bool is_bitvector() const
std::string to_string() const
bool contains(const constant_interval_exprt &interval) const
static bool is_extreme(const exprt &expr)
tvt logical_or(const constant_interval_exprt &o) const
static constant_interval_exprt singleton(const exprt &x)
static exprt simplified_expr(exprt expr)
bool contains_zero() const
constant_interval_exprt handle_constant_unary_expression(const irep_idt &op) const
SET OF ARITHMETIC OPERATORS.
constant_interval_exprt modulo(const constant_interval_exprt &o) const
static exprt get_max(const exprt &a, const exprt &b)
bool has_no_lower_bound() const
static exprt get_min(const exprt &a, const exprt &b)
static bool is_max(const constant_interval_exprt &a)
static void generate_expression(const exprt &lhs, const exprt &rhs, const irep_idt &operation, std::vector< exprt > &collection)
constant_interval_exprt eval(const irep_idt &unary_operator) const
tvt is_definitely_true() const
static bool is_min(const constant_interval_exprt &a)
static exprt generate_modulo_expression(const exprt &lhs, const exprt &rhs)
tvt logical_xor(const constant_interval_exprt &o) const
const exprt & get_lower() const
static void append_multiply_expression_min(const exprt &min, const exprt &other, std::vector< exprt > &collection)
Appends interval bounds that could arise from MIN * other.
constant_interval_exprt right_shift(const constant_interval_exprt &o) const
tvt logical_and(const constant_interval_exprt &o) const
static void append_multiply_expression_max(const exprt &expr, std::vector< exprt > &collection)
Appends interval bounds that could arise from MAX * expr.
constant_interval_exprt bitwise_and(const constant_interval_exprt &o) const
constant_interval_exprt top() const
static bool contains_extreme(const exprt expr)
constant_interval_exprt unary_minus() const
constant_exprt zero() const
tvt less_than(const constant_interval_exprt &o) const
static exprt abs(const exprt &expr)
constant_interval_exprt bitwise_not() const
constant_interval_exprt divide(const constant_interval_exprt &o) const
static constant_interval_exprt simplified_interval(exprt &l, exprt &r)
constant_interval_exprt handle_constant_binary_expression(const constant_interval_exprt &other, const irep_idt &) const
const exprt & get_upper() const
tvt equal(const constant_interval_exprt &o) const
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Base class for all expressions.
bool is_one() const
Return whether the expression is a constant representing 1.
bool is_true() const
Return whether the expression is a constant representing true.
bool is_boolean() const
Return whether the expression represents a Boolean.
bool is_false() const
Return whether the expression is a constant representing false.
bool is_zero() const
Return whether the expression is a constant representing 0.
typet & type()
Return the type of the expression.
The Boolean constant false.
const irep_idt & get(const irep_idt &name) const
const irep_idt & id() const
+∞ upper bound for intervals
-∞ upper bound for intervals
Modulo defined as lhs-(rhs * truncate(lhs/rhs)).
Binary multiplication Associativity is not specified.
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
The plus expression Associativity is not specified.
A base class for shift and rotate operators.
The Boolean constant true.
Semantic type conversion.
The type of an expression, extends irept.
Generic base class for unary expressions.
The unary minus expression.
const constant_interval_exprt operator/(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
bool operator<=(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
const constant_interval_exprt operator%(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
const constant_interval_exprt operator>>(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
bool operator==(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
bool operator<(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
std::ostream & operator<<(std::ostream &out, const constant_interval_exprt &i)
const constant_interval_exprt operator&(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
bool operator>(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
const constant_interval_exprt operator+(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
bool operator!=(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
const constant_interval_exprt operator-(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
const constant_interval_exprt operator*(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
const constant_interval_exprt operator^(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
const constant_interval_exprt operator|(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
bool operator>=(const constant_interval_exprt &lhs, const constant_interval_exprt &rhs)
const constant_interval_exprt operator!(const constant_interval_exprt &lhs)
exprt simplify_expr(exprt src, const namespacet &ns)
#define UNREACHABLE
This should be used to mark dead code.
#define PRECONDITION(CONDITION)
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
#define POSTCONDITION(CONDITION)
API to expression classes.