CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
expr2c_class.h
Go to the documentation of this file.
1/*******************************************************************\
2
3Module:
4
5Author: Daniel Kroening, kroening@kroening.com
6
7\*******************************************************************/
8
9
10#ifndef CPROVER_ANSI_C_EXPR2C_CLASS_H
11#define CPROVER_ANSI_C_EXPR2C_CLASS_H
12
13#include "expr2c.h"
14
15#include <string>
16#include <unordered_map>
17#include <unordered_set>
18
20
21#include <util/bitvector_expr.h>
22#include <util/byte_operators.h>
24#include <util/std_code.h>
25
27class c_qualifierst;
28class namespacet;
29class r_or_w_ok_exprt;
33
35{
36public:
44 virtual ~expr2ct() { }
45
46 virtual std::string convert(const typet &src);
47 virtual std::string convert(const exprt &src);
48
49 void get_shorthands(const exprt &expr);
50
51 std::string
52 convert_with_identifier(const typet &src, const std::string &identifier);
53
54protected:
55 const namespacet &ns;
57
58 virtual std::string convert_rec(
59 const typet &src,
61 const std::string &declarator);
62
63 virtual std::string convert_struct_type(
64 const typet &src,
65 const std::string &qualifiers_str,
66 const std::string &declarator_str);
67
68 std::string convert_struct_type(
69 const typet &src,
70 const std::string &qualifer_str,
71 const std::string &declarator_str,
72 bool inc_struct_body,
74
75 virtual std::string convert_array_type(
76 const typet &src,
78 const std::string &declarator_str);
79
80 std::string convert_array_type(
81 const typet &src,
83 const std::string &declarator_str,
85
86 static std::string indent_str(unsigned indent);
87
88 std::unordered_map<irep_idt, std::unordered_set<irep_idt>> ns_collision;
89 std::unordered_map<irep_idt, irep_idt> shorthands;
90
92
93 irep_idt id_shorthand(const irep_idt &identifier) const;
94
95 std::string convert_typecast(
96 const typecast_exprt &src, unsigned &precedence);
97
99 const exprt &src,
100 unsigned &precedence);
101
102 std::string convert_pointer_difference(
103 const exprt &src,
104 unsigned &precedence);
105
106 std::string convert_binary(
107 const binary_exprt &,
108 const std::string &symbol,
109 unsigned precedence,
110 bool full_parentheses);
111
112 std::string convert_multi_ary(
113 const exprt &src, const std::string &symbol,
114 unsigned precedence, bool full_parentheses);
115
116 std::string convert_cond(
117 const exprt &src, unsigned precedence);
118
119 std::string convert_struct_member_value(
120 const exprt &src, unsigned precedence);
121
122 std::string convert_array_member_value(
123 const exprt &src, unsigned precedence);
124
125 std::string convert_member(
126 const member_exprt &src, unsigned precedence);
127
128 std::string convert_array_of(const exprt &src, unsigned precedence);
129
130 std::string convert_trinary(
131 const ternary_exprt &src,
132 const std::string &symbol1,
133 const std::string &symbol2,
134 unsigned precedence);
135
143 std::string convert_rox(const shift_exprt &src, unsigned precedence);
144
145 std::string convert_overflow(
146 const exprt &src, unsigned &precedence);
147
148 std::string convert_binding(
149 const binding_exprt &,
150 const std::string &symbol,
151 unsigned precedence);
152
153 std::string convert_with(
154 const exprt &src, unsigned precedence);
155
156 std::string convert_update(const update_exprt &, unsigned precedence);
157
158 std::string convert_member_designator(
159 const exprt &src);
160
161 std::string convert_index_designator(
162 const exprt &src);
163
164 std::string convert_index(const binary_exprt &, unsigned precedence);
165
166 std::string
168
169 std::string
171
172 std::string convert_extractbit(const extractbit_exprt &, unsigned precedence);
173
174 std::string
176
177 std::string convert_unary(
178 const unary_exprt &,
179 const std::string &symbol,
180 unsigned precedence);
181
182 std::string convert_unary_post(
183 const exprt &src, const std::string &symbol,
184 unsigned precedence);
185
188 std::optional<std::string> convert_function(const exprt &src);
189 std::string convert_function(const exprt &src, const std::string &symbol);
190
191 std::string convert_complex(
192 const exprt &src,
193 unsigned precedence);
194
195 std::string convert_comma(
196 const exprt &src,
197 unsigned precedence);
198
199 std::string convert_Hoare(const exprt &src);
200
201 std::string convert_code(const codet &src);
202 virtual std::string convert_code(const codet &src, unsigned indent);
203 std::string convert_code_label(const code_labelt &src, unsigned indent);
204 // NOLINTNEXTLINE(whitespace/line_length)
205 std::string convert_code_switch_case(const code_switch_caset &src, unsigned indent);
206 std::string convert_code_asm(const code_asmt &src, unsigned indent);
207 std::string
208 convert_code_frontend_assign(const code_frontend_assignt &, unsigned indent);
209 // NOLINTNEXTLINE(whitespace/line_length)
210 std::string convert_code_ifthenelse(const code_ifthenelset &src, unsigned indent);
211 std::string convert_code_for(const code_fort &src, unsigned indent);
212 std::string convert_code_while(const code_whilet &src, unsigned indent);
213 std::string convert_code_dowhile(const code_dowhilet &src, unsigned indent);
214 std::string convert_code_block(const code_blockt &src, unsigned indent);
215 std::string convert_code_expression(const codet &src, unsigned indent);
216 std::string convert_code_return(const codet &src, unsigned indent);
217 std::string convert_code_goto(const codet &src, unsigned indent);
218 std::string convert_code_assume(const codet &src, unsigned indent);
219 std::string convert_code_assert(const codet &src, unsigned indent);
220 std::string convert_code_break(unsigned indent);
221 std::string convert_code_switch(const codet &src, unsigned indent);
222 std::string convert_code_continue(unsigned indent);
223 std::string convert_code_frontend_decl(const codet &, unsigned indent);
224 std::string convert_code_decl_block(const codet &src, unsigned indent);
225 std::string convert_code_dead(const codet &src, unsigned indent);
226 // NOLINTNEXTLINE(whitespace/line_length)
227 std::string convert_code_function_call(const code_function_callt &src, unsigned indent);
228 std::string convert_code_lock(const codet &src, unsigned indent);
229 std::string convert_code_unlock(const codet &src, unsigned indent);
230 std::string convert_code_printf(const codet &src, unsigned indent);
231 std::string convert_code_fence(const codet &src, unsigned indent);
232 std::string convert_code_input(const codet &src, unsigned indent);
233 std::string convert_code_output(const codet &src, unsigned indent);
234 std::string convert_code_array_set(const codet &src, unsigned indent);
235 std::string convert_code_array_copy(const codet &src, unsigned indent);
236 std::string convert_code_array_replace(const codet &src, unsigned indent);
237
238 virtual std::string convert_with_precedence(
239 const exprt &src, unsigned &precedence);
240
241 std::string
245 std::string convert_allocate(const exprt &src, unsigned &precedence);
246 std::string convert_nondet(const exprt &src, unsigned &precedence);
247 std::string convert_prob_coin(const exprt &src, unsigned &precedence);
248 std::string convert_prob_uniform(const exprt &src, unsigned &precedence);
249 // NOLINTNEXTLINE(whitespace/line_length)
250 std::string convert_statement_expression(const exprt &src, unsigned &precendence);
251
252 virtual std::string convert_symbol(const exprt &src);
253 std::string convert_predicate_symbol(const exprt &src);
254 std::string convert_predicate_next_symbol(const exprt &src);
255 std::string convert_predicate_passive_symbol(const exprt &src);
256 std::string convert_nondet_symbol(const nondet_symbol_exprt &);
257 std::string convert_quantified_symbol(const exprt &src);
258 std::string convert_nondet_bool();
259 std::string convert_object_descriptor(const exprt &src, unsigned &precedence);
260 std::string convert_literal(const exprt &src);
261 // NOLINTNEXTLINE(whitespace/line_length)
262 virtual std::string convert_constant(const constant_exprt &src, unsigned &precedence);
263 virtual std::string convert_constant_bool(bool boolean_value);
264 virtual std::string convert_annotated_pointer_constant(
266 unsigned &precedence);
267
268 std::string convert_norep(const exprt &src, unsigned &precedence);
269
270 virtual std::string convert_struct(const exprt &src, unsigned &precedence);
271 std::string convert_union(const exprt &src, unsigned &precedence);
272 std::string convert_vector(const exprt &src, unsigned &precedence);
273 std::string convert_array(const exprt &src);
274 std::string convert_array_list(const exprt &src, unsigned &precedence);
275 std::string convert_initializer_list(const exprt &src);
276 std::string convert_designated_initializer(const exprt &src);
277 std::string convert_concatenation(const exprt &src, unsigned &precedence);
278 std::string convert_sizeof(const exprt &src, unsigned &precedence);
279 std::string convert_let(const let_exprt &, unsigned precedence);
280
281 std::string convert_struct(
282 const exprt &src,
283 unsigned &precedence,
285
286 std::string convert_conditional_target_group(const exprt &src);
287 std::string convert_bitreverse(const bitreverse_exprt &src);
288
289 std::string convert_r_or_w_ok(const r_or_w_ok_exprt &src);
291 std::string convert_pointer_in_range(const pointer_in_range_exprt &src);
292 std::string
294};
295
296#endif // CPROVER_ANSI_C_EXPR2C_CLASS_H
API to expression classes for bitvectors.
Expression classes for byte-level operators.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
Pointer-typed bitvector constant annotated with the pointer expression that the bitvector is the nume...
A base class for binary expressions.
Definition std_expr.h:638
A base class for variable bindings (quantifiers, let, lambda)
Definition std_expr.h:3234
Reverse the order of bits in a bit-vector.
Expression of type type extracted from some object op starting at position offset (given in number of...
Expression corresponding to op() where the bytes starting at position offset (given in number of byte...
codet representation of an inline assembler statement.
Definition std_code.h:1253
A codet representing sequential composition of program statements.
Definition std_code.h:130
codet representation of a do while statement.
Definition std_code.h:672
codet representation of a for statement.
Definition std_code.h:734
A codet representing an assignment in the program.
Definition std_code.h:24
goto_instruction_codet representation of a function call statement.
codet representation of an if-then-else statement.
Definition std_code.h:460
codet representation of a label for branch targets.
Definition std_code.h:959
codet representation of a switch-case, i.e. a case statement within a switch.
Definition std_code.h:1023
codet representing a while statement.
Definition std_code.h:610
Data structure for representing an arbitrary statement in a program.
A constant literal expression.
Definition std_expr.h:3117
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition dstring.h:38
std::optional< std::string > convert_function(const exprt &src)
Returns a string if src is a function with a known conversion, else returns nullopt.
Definition expr2c.cpp:4080
std::string convert_nondet(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:1169
std::string convert_literal(const exprt &src)
Definition expr2c.cpp:1204
std::string convert_code_continue(unsigned indent)
Definition expr2c.cpp:2807
std::string convert_code_switch_case(const code_switch_caset &src, unsigned indent)
Definition expr2c.cpp:3403
std::string convert_typecast(const typecast_exprt &src, unsigned &precedence)
Definition expr2c.cpp:752
std::string convert_comma(const exprt &src, unsigned precedence)
Definition expr2c.cpp:1241
std::string convert_code_assert(const codet &src, unsigned indent)
Definition expr2c.cpp:3358
std::string convert_union(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:2174
virtual std::string convert_rec(const typet &src, const c_qualifierst &qualifiers, const std::string &declarator)
Definition expr2c.cpp:218
std::string convert_code_expression(const codet &src, unsigned indent)
Definition expr2c.cpp:2949
std::string convert_code_goto(const codet &src, unsigned indent)
Definition expr2c.cpp:2743
std::string convert_code_switch(const codet &src, unsigned indent)
Definition expr2c.cpp:2764
std::string convert_pointer_in_range(const pointer_in_range_exprt &src)
Definition expr2c.cpp:3607
std::string convert_initializer_list(const exprt &src)
Definition expr2c.cpp:2330
std::string convert_quantified_symbol(const exprt &src)
Definition expr2c.cpp:1690
std::string convert_binding(const binding_exprt &, const std::string &symbol, unsigned precedence)
Definition expr2c.cpp:833
std::string convert_function_application(const function_application_exprt &src)
Definition expr2c.cpp:2459
std::string convert_code_unlock(const codet &src, unsigned indent)
Definition expr2c.cpp:3137
std::string convert_code_decl_block(const codet &src, unsigned indent)
Definition expr2c.cpp:2934
static std::string indent_str(unsigned indent)
Definition expr2c.cpp:2547
std::string convert_byte_update(const byte_update_exprt &, unsigned precedence)
Definition expr2c.cpp:1351
std::string convert_code(const codet &src)
Definition expr2c.cpp:3433
std::string convert_pointer_arithmetic(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:1417
std::string convert_let(const let_exprt &, unsigned precedence)
Definition expr2c.cpp:922
std::string convert_nondet_bool()
Definition expr2c.cpp:1696
std::string convert_norep(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:1615
const expr2c_configurationt & configuration
std::unordered_map< irep_idt, std::unordered_set< irep_idt > > ns_collision
std::string convert_code_output(const codet &src, unsigned indent)
Definition expr2c.cpp:3272
std::string convert_code_while(const code_whilet &src, unsigned indent)
Definition expr2c.cpp:2630
std::string convert_index_designator(const exprt &src)
Definition expr2c.cpp:1503
std::string convert_code_frontend_decl(const codet &, unsigned indent)
Definition expr2c.cpp:2817
std::string convert_pointer_difference(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:1454
std::string convert_code_block(const code_blockt &src, unsigned indent)
Definition expr2c.cpp:2911
std::string convert_code_asm(const code_asmt &src, unsigned indent)
Definition expr2c.cpp:2552
std::string convert_prophecy_pointer_in_range(const prophecy_pointer_in_range_exprt &src)
Definition expr2c.cpp:3625
std::string convert_allocate(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:1141
std::string convert_Hoare(const exprt &src)
Definition expr2c.cpp:3438
std::string convert_sizeof(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:3514
std::string convert_code_lock(const codet &src, unsigned indent)
Definition expr2c.cpp:3124
std::string convert_r_or_w_ok(const r_or_w_ok_exprt &src)
Definition expr2c.cpp:3569
std::string convert_code_dowhile(const code_dowhilet &src, unsigned indent)
Definition expr2c.cpp:2656
irep_idt id_shorthand(const irep_idt &identifier) const
Definition expr2c.cpp:75
std::string convert_cond(const exprt &src, unsigned precedence)
Definition expr2c.cpp:987
std::string convert_side_effect_expr_function_call(const side_effect_expr_function_callt &src)
Definition expr2c.cpp:2487
std::string convert_overflow(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:2516
std::string convert_member(const member_exprt &src, unsigned precedence)
Definition expr2c.cpp:1513
void get_shorthands(const exprt &expr)
Definition expr2c.cpp:116
std::string convert_code_for(const code_fort &src, unsigned indent)
Definition expr2c.cpp:2874
std::string convert_with_identifier(const typet &src, const std::string &identifier)
Build a declaration string, which requires converting both a type and putting an identifier in the sy...
Definition expr2c.cpp:4148
std::string convert_extractbits(const extractbits_exprt &src, unsigned precedence)
Definition expr2c.cpp:3493
virtual std::string convert_struct(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:2038
std::string convert_trinary(const ternary_exprt &src, const std::string &symbol1, const std::string &symbol2, unsigned precedence)
Definition expr2c.cpp:786
std::string convert_prob_coin(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:1194
std::string convert_update(const update_exprt &, unsigned precedence)
Definition expr2c.cpp:949
std::string convert_nondet_symbol(const nondet_symbol_exprt &)
Definition expr2c.cpp:1666
std::string convert_code_printf(const codet &src, unsigned indent)
Definition expr2c.cpp:3198
std::string convert_unary(const unary_exprt &, const std::string &symbol, unsigned precedence)
Definition expr2c.cpp:1121
std::string convert_code_ifthenelse(const code_ifthenelset &src, unsigned indent)
Definition expr2c.cpp:2685
std::string convert_index(const binary_exprt &, unsigned precedence)
Definition expr2c.cpp:1398
std::string convert_member_designator(const exprt &src)
Definition expr2c.cpp:1493
std::string convert_byte_extract(const byte_extract_exprt &, unsigned precedence)
Definition expr2c.cpp:1325
std::string convert_code_label(const code_labelt &src, unsigned indent)
Definition expr2c.cpp:3385
virtual std::string convert_symbol(const exprt &src)
Definition expr2c.cpp:1626
virtual std::string convert_constant(const constant_exprt &src, unsigned &precedence)
Definition expr2c.cpp:1771
std::string convert_code_array_copy(const codet &src, unsigned indent)
Definition expr2c.cpp:3315
std::string convert_concatenation(const exprt &src, unsigned &precedence)
std::string convert_statement_expression(const exprt &src, unsigned &precendence)
Definition expr2c.cpp:1179
std::string convert_struct_member_value(const exprt &src, unsigned precedence)
Definition expr2c.cpp:1605
std::string convert_code_dead(const codet &src, unsigned indent)
Definition expr2c.cpp:2860
const namespacet & ns
virtual std::string convert_annotated_pointer_constant(const annotated_pointer_constant_exprt &src, unsigned &precedence)
Definition expr2c.cpp:2017
std::string convert_rox(const shift_exprt &src, unsigned precedence)
Conversion function from rol/ror expressions to C code strings Note that this constructs a complex ex...
Definition expr2c.cpp:2356
virtual std::string convert_with_precedence(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:3645
std::string convert_designated_initializer(const exprt &src)
Definition expr2c.cpp:2416
std::string convert_vector(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:2127
std::string convert_multi_ary(const exprt &src, const std::string &symbol, unsigned precedence, bool full_parentheses)
Definition expr2c.cpp:1073
std::string convert_array_member_value(const exprt &src, unsigned precedence)
Definition expr2c.cpp:1595
virtual ~expr2ct()
std::string convert_unary_post(const exprt &src, const std::string &symbol, unsigned precedence)
Definition expr2c.cpp:1376
std::unordered_map< irep_idt, irep_idt > shorthands
std::string convert_complex(const exprt &src, unsigned precedence)
Definition expr2c.cpp:1265
std::string convert_code_function_call(const code_function_callt &src, unsigned indent)
Definition expr2c.cpp:3150
std::string convert_code_fence(const codet &src, unsigned indent)
Definition expr2c.cpp:3220
std::string convert_bitreverse(const bitreverse_exprt &src)
Definition expr2c.cpp:3553
virtual std::string convert(const typet &src)
Definition expr2c.cpp:213
std::string convert_code_return(const codet &src, unsigned indent)
Definition expr2c.cpp:2722
std::string convert_code_break(unsigned indent)
Definition expr2c.cpp:2755
virtual std::string convert_struct_type(const typet &src, const std::string &qualifiers_str, const std::string &declarator_str)
To generate C-like string for defining the given struct.
Definition expr2c.cpp:637
std::string convert_with(const exprt &src, unsigned precedence)
Definition expr2c.cpp:856
std::string convert_code_frontend_assign(const code_frontend_assignt &, unsigned indent)
Definition expr2c.cpp:3116
std::string convert_object_descriptor(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:1701
std::string convert_predicate_passive_symbol(const exprt &src)
Definition expr2c.cpp:1684
std::string convert_array_list(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:2296
unsigned sizeof_nesting
std::string convert_array_of(const exprt &src, unsigned precedence)
Definition expr2c.cpp:1315
std::string convert_code_array_replace(const codet &src, unsigned indent)
Definition expr2c.cpp:3337
std::string convert_conditional_target_group(const exprt &src)
Definition expr2c.cpp:3528
std::string convert_code_assume(const codet &src, unsigned indent)
Definition expr2c.cpp:3371
virtual std::string convert_array_type(const typet &src, const c_qualifierst &qualifiers, const std::string &declarator_str)
To generate a C-like type declaration of an array.
Definition expr2c.cpp:713
std::string convert_code_input(const codet &src, unsigned indent)
Definition expr2c.cpp:3250
std::string convert_extractbit(const extractbit_exprt &, unsigned precedence)
Definition expr2c.cpp:3482
std::string convert_predicate_next_symbol(const exprt &src)
Definition expr2c.cpp:1678
std::string convert_code_array_set(const codet &src, unsigned indent)
Definition expr2c.cpp:3293
std::string convert_binary(const binary_exprt &, const std::string &symbol, unsigned precedence, bool full_parentheses)
Definition expr2c.cpp:1021
virtual std::string convert_constant_bool(bool boolean_value)
To get the C-like representation of a given boolean value.
Definition expr2c.cpp:2030
std::string convert_predicate_symbol(const exprt &src)
Definition expr2c.cpp:1672
expr2ct(const namespacet &_ns, const expr2c_configurationt &configuration=expr2c_configurationt::default_configuration)
std::string convert_prophecy_r_or_w_ok(const prophecy_r_or_w_ok_exprt &src)
Definition expr2c.cpp:3588
std::string convert_array(const exprt &src)
Definition expr2c.cpp:2193
std::string convert_prob_uniform(const exprt &src, unsigned &precedence)
Definition expr2c.cpp:1209
Base class for all expressions.
Definition expr.h:56
Extracts a single bit of a bit-vector operand.
Extracts a sub-range of a bit-vector operand.
Application of (mathematical) function.
A let expression.
Definition std_expr.h:3331
Extract member of struct or union.
Definition std_expr.h:2971
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition namespace.h:91
Expression to hold a nondeterministic choice.
Definition std_expr.h:292
pointer_in_range(a, b, c) evaluates to true iff same_object(a, b, c) ∧ r_ok(a, offset(c)-offset(a)) ∧...
pointer_in_range (see pointer_in_range_exprt) with prophecy expressions to encode whether a pointer r...
A base class for a predicate that indicates that an address range is ok to read or write or both.
A base class for a predicate that indicates that an address range is ok to read or write or both.
A base class for shift and rotate operators.
A side_effect_exprt representation of a function call side effect.
Definition std_code.h:1692
An expression with three operands.
Definition std_expr.h:67
Semantic type conversion.
Definition std_expr.h:2073
The type of an expression, extends irept.
Definition type.h:29
Generic base class for unary expressions.
Definition std_expr.h:361
Operator to update elements in structs and arrays.
Definition std_expr.h:2782
API to expression classes for 'mathematical' expressions.
Used for configuring the behaviour of expr2c and type2c.
Definition expr2c.h:21
static expr2c_configurationt default_configuration
This prints a human readable C like syntax that closely mirrors the internals of the GOTO program.
Definition expr2c.h:40