CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
string_constraint.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module: String solver
4
5Author: Diffblue Ltd.
6
7\*******************************************************************/
8
9#include "string_constraint.h"
10
11#include <util/namespace.h>
12#include <util/symbol_table.h>
13
16
22static bool cannot_be_neg(const exprt &expr, message_handlert &message_handler)
23{
24 satcheck_no_simplifiert sat_check(message_handler);
25 symbol_tablet symbol_table;
26 namespacet ns(symbol_table);
27 bv_pointerst solver{ns, sat_check, message_handler};
28 const exprt zero = from_integer(0, expr.type());
29 const binary_relation_exprt non_neg(expr, ID_lt, zero);
30 solver << non_neg;
32}
33
36 const exprt &lower_bound,
37 const exprt &upper_bound,
38 const exprt &body,
39 message_handlert &message_handler)
40 : univ_var(_univ_var),
41 lower_bound(lower_bound),
42 upper_bound(upper_bound),
43 body(body)
44{
46 cannot_be_neg(lower_bound, message_handler),
47 "String constraints must have non-negative lower bound.\n" +
50 cannot_be_neg(upper_bound, message_handler),
51 "String constraints must have non-negative upper bound.\n" +
53}
54
59{
60 std::ostringstream out;
61 out << "forall x in [" << format(expr.univ_lower_bound) << ", "
62 << format(expr.univ_upper_bound) << "). " << format(expr.premise)
63 << " => ("
64 << "exists y in [" << format(expr.exists_lower_bound) << ", "
65 << format(expr.exists_upper_bound) << "). " << format(expr.s0)
66 << "[x+y] != " << format(expr.s1) << "[y])";
67 return out.str();
68}
69
73{
74 replace_map.replace_expr(constraint.univ_lower_bound);
75 replace_map.replace_expr(constraint.univ_upper_bound);
76 replace_map.replace_expr(constraint.premise);
77 replace_map.replace_expr(constraint.exists_lower_bound);
78 replace_map.replace_expr(constraint.exists_upper_bound);
79 replace_map.replace_expr(constraint.s0);
80 replace_map.replace_expr(constraint.s1);
81}
82
86{
87 return left.univ_upper_bound == right.univ_upper_bound &&
88 left.univ_lower_bound == right.univ_lower_bound &&
91 left.premise == right.premise && left.s0 == right.s0 &&
92 left.s1 == right.s1;
93}
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
A base class for relations, i.e., binary predicates whose two operands have the same type.
Definition std_expr.h:762
Base class for all expressions.
Definition expr.h:56
typet & type()
Return the type of the expression.
Definition expr.h:84
std::string pretty(unsigned indent=0, unsigned max_indent=0) const
Definition irep.cpp:482
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition namespace.h:91
string_constraintt(const symbol_exprt &_univ_var, const exprt &lower_bound, const exprt &upper_bound, const exprt &body, message_handlert &message_handler)
Expression to hold a symbol (variable)
Definition std_expr.h:131
The symbol table.
Similar interface to union-find for expressions, with a function for replacing sub-expressions by the...
static format_containert< T > format(const T &o)
Definition format.h:37
void solver(std::vector< framet > &frames, const std::unordered_set< symbol_exprt, irep_hash > &address_taken, const solver_optionst &solver_options, const namespacet &ns, std::vector< propertyt > &properties, std::size_t property_index)
Definition solver.cpp:44
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
Definition invariant.h:423
void replace(const union_find_replacet &replace_map, string_not_contains_constraintt &constraint)
static bool cannot_be_neg(const exprt &expr, message_handlert &message_handler)
Runs a solver instance to verify whether an expression can only be non-negative.
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
bool operator==(const string_not_contains_constraintt &left, const string_not_contains_constraintt &right)
Defines string constraints.
Constraints to encode non containement of strings.
Author: Diffblue Ltd.