CBMC
string_refinement.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: String support via creating string constraints and progressively
4  instantiating the universal constraints as needed.
5  The procedure is described in the PASS paper at HVC'13:
6  "PASS: String Solving with Parameterized Array and Interval Automaton"
7  by Guodong Li and Indradeep Ghosh
8 
9 Author: Alberto Griggio, alberto.griggio@gmail.com
10 
11 \*******************************************************************/
12 
19 
20 #ifndef CPROVER_SOLVERS_REFINEMENT_STRING_REFINEMENT_H
21 #define CPROVER_SOLVERS_REFINEMENT_STRING_REFINEMENT_H
22 
24 
26 
28 #include "string_dependencies.h"
29 #include "string_refinement_util.h"
30 
31 // clang-format off
32 #define OPT_STRING_REFINEMENT \
33  "(no-refine-strings)" \
34  "(string-printable)" \
35  "(string-input-value):" \
36  "(string-non-empty)" \
37  "(max-nondet-string-length):"
38 
39 #define HELP_STRING_REFINEMENT \
40  " --no-refine-strings turn off string refinement\n" \
41  " --string-printable restrict to printable strings and characters\n" /* NOLINT(*) */ \
42  " --string-non-empty restrict to non-empty strings (experimental)\n" /* NOLINT(*) */ \
43  " --string-input-value st restrict non-null strings to a fixed value st;\n" /* NOLINT(*) */ \
44  " the switch can be used multiple times to give\n" /* NOLINT(*) */ \
45  " several strings\n" /* NOLINT(*) */ \
46  " --max-nondet-string-length n bound the length of nondet (e.g. input) strings.\n" /* NOLINT(*) */ \
47  " Default is " + std::to_string(MAX_CONCRETE_STRING_SIZE - 1) + "; note that\n" /* NOLINT(*) */ \
48  " setting the value higher than this does not work\n" /* NOLINT(*) */ \
49  " with --trace or --validate-trace.\n" /* NOLINT(*) */
50 
51 // The integration of the string solver into CBMC is incomplete. Therefore,
52 // it is not turned on by default and not all options are available.
53 #define OPT_STRING_REFINEMENT_CBMC \
54  "(refine-strings)" \
55  "(string-printable)"
56 
57 #define HELP_STRING_REFINEMENT_CBMC \
58  " --refine-strings use string refinement (experimental)\n" \
59  " --string-printable restrict to printable strings (experimental)\n" /* NOLINT(*) */
60 // clang-format on
61 
62 #define DEFAULT_MAX_NB_REFINEMENT std::numeric_limits<size_t>::max()
63 
64 class string_refinementt final : public bv_refinementt
65 {
66 private:
67  struct configt
68  {
69  std::size_t refinement_bound = 0;
70  bool use_counter_example = true;
71  };
72 
73 public:
75  struct infot : public bv_refinementt::infot, public configt
76  {
77  };
78 
79  explicit string_refinementt(const infot &);
80 
81  std::string decision_procedure_text() const override
82  {
83  return "string refinement loop with " + prop.solver_text();
84  }
85 
86  exprt get(const exprt &expr) const override;
87  void set_to(const exprt &expr, bool value) override;
89 
90 private:
91  // Base class
93 
94  string_refinementt(const infot &, bool);
95 
97  std::size_t loop_bound_;
99 
100  // Simple constraints that have been given to the solver
101  std::set<exprt> seen_instances;
102 
104 
105  // Unquantified lemmas that have newly been added
106  std::vector<exprt> current_constraints;
107 
108  // See the definition in the PASS article
109  // Warning: this is indexed by array_expressions and not string expressions
110 
113 
114  std::vector<exprt> equations;
115 
117 
118  void add_lemma(const exprt &lemma, bool simplify_lemma = true);
119 };
120 
121 exprt substitute_array_lists(exprt expr, std::size_t string_max_length);
122 
123 // Declaration required for unit-test:
125  const std::vector<equal_exprt> &equations,
126  const namespacet &ns,
127  messaget::mstreamt &stream);
128 
129 // Declaration required for unit-test:
131  exprt expr,
132  symbol_generatort &symbol_generator,
133  const bool left_propagate);
134 
135 #endif
string_refinementt::loop_bound_
std::size_t loop_bound_
Definition: string_refinement.h:97
string_refinementt::generator
string_constraint_generatort generator
Definition: string_refinement.h:98
propt::solver_text
virtual const std::string solver_text()=0
union_find_replace.h
string_refinementt::current_constraints
std::vector< exprt > current_constraints
Definition: string_refinement.h:106
bv_refinementt::infot
Definition: bv_refinement.h:33
index_set_pairt
Definition: string_refinement_util.h:59
bv_refinement.h
string_refinementt::configt::refinement_bound
std::size_t refinement_bound
Definition: string_refinement.h:69
exprt
Base class for all expressions.
Definition: expr.h:55
string_refinementt::index_sets
index_set_pairt index_sets
Definition: string_refinement.h:111
string_axiomst
Definition: string_refinement_util.h:65
string_dependencies.h
string_constraint_generatort
Definition: string_constraint_generator.h:47
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
symbol_generatort
Generation of fresh symbols of a given type.
Definition: array_pool.h:21
string_refinement_util.h
string_refinementt::get
exprt get(const exprt &expr) const override
Evaluates the given expression in the valuation found by string_refinementt::dec_solve.
Definition: string_refinement.cpp:1819
string_refinementt::supert
bv_refinementt supert
Definition: string_refinement.h:92
substitute_array_access
exprt substitute_array_access(exprt expr, symbol_generatort &symbol_generator, const bool left_propagate)
Create an equivalent expression where array accesses and 'with' expressions are replaced by 'if' expr...
Definition: string_refinement.cpp:1271
substitute_array_lists
exprt substitute_array_lists(exprt expr, std::size_t string_max_length)
string_refinementt::axioms
string_axiomst axioms
Definition: string_refinement.h:103
bv_refinementt
Definition: bv_refinement.h:19
string_refinementt::symbol_resolve
union_find_replacet symbol_resolve
Definition: string_refinement.h:112
decision_proceduret::resultt
resultt
Result of running the decision procedure.
Definition: decision_procedure.h:43
string_refinementt::dec_solve
decision_proceduret::resultt dec_solve() override
Main decision procedure of the solver.
Definition: string_refinement.cpp:607
string_refinementt::dependencies
string_dependenciest dependencies
Definition: string_refinement.h:116
string_refinementt::configt
Definition: string_refinement.h:67
string_refinementt
Definition: string_refinement.h:64
union_find_replacet
Similar interface to union-find for expressions, with a function for replacing sub-expressions by the...
Definition: union_find_replace.h:16
string_dependenciest
Keep track of dependencies between strings.
Definition: string_dependencies.h:24
string_refinementt::decision_procedure_text
std::string decision_procedure_text() const override
Return a textual description of the decision procedure.
Definition: string_refinement.h:81
messaget::mstreamt
Definition: message.h:223
string_refinementt::equations
std::vector< exprt > equations
Definition: string_refinement.h:114
string_identifiers_resolution_from_equations
union_find_replacet string_identifiers_resolution_from_equations(const std::vector< equal_exprt > &equations, const namespacet &ns, messaget::mstreamt &stream)
Symbol resolution for expressions of type string typet.
Definition: string_refinement.cpp:463
string_refinementt::add_lemma
void add_lemma(const exprt &lemma, bool simplify_lemma=true)
Add the given lemma to the solver.
Definition: string_refinement.cpp:898
string_refinementt::infot
string_refinementt constructor arguments
Definition: string_refinement.h:75
string_refinementt::config_
const configt config_
Definition: string_refinement.h:96
string_refinementt::set_to
void set_to(const exprt &expr, bool value) override
Record the constraints to ensure that the expression is true when the boolean is true and false other...
Definition: string_refinement.cpp:283
string_refinementt::configt::use_counter_example
bool use_counter_example
Definition: string_refinement.h:70
string_constraint_generator.h
string_refinementt::string_refinementt
string_refinementt(const infot &)
Definition: string_refinement.cpp:165
string_refinementt::seen_instances
std::set< exprt > seen_instances
Definition: string_refinement.h:101
prop_conv_solvert::prop
propt & prop
Definition: prop_conv_solver.h:130