@@ -14,9 +14,140 @@ Date: March 2023
14
14
#include < util/prefix.h>
15
15
#include < util/suffix.h>
16
16
17
- bool dfcc_is_cprover_symbol (const irep_idt &id)
17
+ #include < unordered_set>
18
+
19
+ static std::unordered_set<irep_idt> function_symbols;
20
+ static std::unordered_set<irep_idt> static_symbols;
21
+
22
+ static void init_function_symbols ()
23
+ {
24
+ // the set of all CPROVER symbols that we know of
25
+ if (function_symbols.empty ())
26
+ {
27
+ function_symbols.insert (CPROVER_PREFIX " _start" );
28
+ function_symbols.insert (CPROVER_PREFIX " array_set" );
29
+ function_symbols.insert (CPROVER_PREFIX " assert" );
30
+ function_symbols.insert (CPROVER_PREFIX " assignable" );
31
+ function_symbols.insert (CPROVER_PREFIX " assume" );
32
+ function_symbols.insert (CPROVER_PREFIX " contracts_car_create" );
33
+ function_symbols.insert (CPROVER_PREFIX " contracts_car_set_contains" );
34
+ function_symbols.insert (CPROVER_PREFIX " contracts_car_set_create" );
35
+ function_symbols.insert (CPROVER_PREFIX " contracts_car_set_insert" );
36
+ function_symbols.insert (CPROVER_PREFIX " contracts_car_set_remove" );
37
+ function_symbols.insert (
38
+ CPROVER_PREFIX " contracts_check_replace_ensures_was_freed_preconditions" );
39
+ function_symbols.insert (CPROVER_PREFIX " contracts_free" );
40
+ function_symbols.insert (CPROVER_PREFIX " contracts_is_freeable" );
41
+ function_symbols.insert (CPROVER_PREFIX " contracts_is_fresh" );
42
+ function_symbols.insert (CPROVER_PREFIX " contracts_link_allocated" );
43
+ function_symbols.insert (CPROVER_PREFIX " contracts_link_deallocated" );
44
+ function_symbols.insert (CPROVER_PREFIX " contracts_link_is_fresh" );
45
+ function_symbols.insert (CPROVER_PREFIX " contracts_obeys_contract" );
46
+ function_symbols.insert (CPROVER_PREFIX " contracts_obj_set_add" );
47
+ function_symbols.insert (CPROVER_PREFIX " contracts_obj_set_append" );
48
+ function_symbols.insert (CPROVER_PREFIX " contracts_obj_set_contains_exact" );
49
+ function_symbols.insert (CPROVER_PREFIX " contracts_obj_set_contains" );
50
+ function_symbols.insert (CPROVER_PREFIX " contracts_obj_set_create_append" );
51
+ function_symbols.insert (CPROVER_PREFIX
52
+ " contracts_obj_set_create_indexed_by_object_id" );
53
+ function_symbols.insert (CPROVER_PREFIX " contracts_obj_set_release" );
54
+ function_symbols.insert (CPROVER_PREFIX " contracts_obj_set_remove" );
55
+ function_symbols.insert (CPROVER_PREFIX " contracts_pointer_in_range_dfcc" );
56
+ function_symbols.insert (CPROVER_PREFIX " contracts_was_freed" );
57
+ function_symbols.insert (CPROVER_PREFIX " contracts_write_set_add_allocated" );
58
+ function_symbols.insert (CPROVER_PREFIX " contracts_write_set_add_decl" );
59
+ function_symbols.insert (CPROVER_PREFIX " contracts_write_set_add_freeable" );
60
+ function_symbols.insert (
61
+ CPROVER_PREFIX
62
+ " contracts_write_set_check_allocated_deallocated_is_empty" );
63
+ function_symbols.insert (CPROVER_PREFIX
64
+ " contracts_write_set_check_array_copy" );
65
+ function_symbols.insert (CPROVER_PREFIX
66
+ " contracts_write_set_check_array_replace" );
67
+ function_symbols.insert (CPROVER_PREFIX
68
+ " contracts_write_set_check_array_set" );
69
+ function_symbols.insert (CPROVER_PREFIX
70
+ " contracts_write_set_check_assignment" );
71
+ function_symbols.insert (
72
+ CPROVER_PREFIX " contracts_write_set_check_assigns_clause_inclusion" );
73
+ function_symbols.insert (CPROVER_PREFIX
74
+ " contracts_write_set_check_deallocate" );
75
+ function_symbols.insert (CPROVER_PREFIX
76
+ " contracts_write_set_check_frees_clause_inclusion" );
77
+ function_symbols.insert (CPROVER_PREFIX
78
+ " contracts_write_set_check_havoc_object" );
79
+ function_symbols.insert (CPROVER_PREFIX " contracts_write_set_create" );
80
+ function_symbols.insert (CPROVER_PREFIX
81
+ " contracts_write_set_deallocate_freeable" );
82
+ function_symbols.insert (CPROVER_PREFIX
83
+ " contracts_write_set_havoc_get_assignable_target" );
84
+ function_symbols.insert (CPROVER_PREFIX
85
+ " contracts_write_set_havoc_object_whole" );
86
+ function_symbols.insert (CPROVER_PREFIX " contracts_write_set_havoc_slice" );
87
+ function_symbols.insert (CPROVER_PREFIX
88
+ " contracts_write_set_insert_assignable" );
89
+ function_symbols.insert (CPROVER_PREFIX
90
+ " contracts_write_set_insert_object_from" );
91
+ function_symbols.insert (CPROVER_PREFIX
92
+ " contracts_write_set_insert_object_upto" );
93
+ function_symbols.insert (CPROVER_PREFIX
94
+ " contracts_write_set_insert_object_whole" );
95
+ function_symbols.insert (CPROVER_PREFIX " contracts_write_set_record_dead" );
96
+ function_symbols.insert (CPROVER_PREFIX
97
+ " contracts_write_set_record_deallocated" );
98
+ function_symbols.insert (CPROVER_PREFIX " contracts_write_set_release" );
99
+ function_symbols.insert (CPROVER_PREFIX " deallocate" );
100
+ function_symbols.insert (CPROVER_PREFIX " freeable" );
101
+ function_symbols.insert (CPROVER_PREFIX " havoc_object" );
102
+ function_symbols.insert (CPROVER_PREFIX " havoc_slice" );
103
+ function_symbols.insert (CPROVER_PREFIX " initialize" );
104
+ function_symbols.insert (CPROVER_PREFIX " is_freeable" );
105
+ function_symbols.insert (CPROVER_PREFIX " is_fresh" );
106
+ function_symbols.insert (CPROVER_PREFIX " obeys_contract" );
107
+ function_symbols.insert (CPROVER_PREFIX " object_from" );
108
+ function_symbols.insert (CPROVER_PREFIX " object_upto" );
109
+ function_symbols.insert (CPROVER_PREFIX " object_whole" );
110
+ function_symbols.insert (CPROVER_PREFIX " pointer_in_range_dfcc" );
111
+ function_symbols.insert (CPROVER_PREFIX " precondition" );
112
+ function_symbols.insert (CPROVER_PREFIX " printf" );
113
+ function_symbols.insert (CPROVER_PREFIX " was_freed" );
114
+ }
115
+ }
116
+
117
+ static void init_static_symbols ()
118
+ {
119
+ if (static_symbols.empty ())
120
+ {
121
+ static_symbols.insert (CPROVER_PREFIX " pipe_offset" );
122
+ static_symbols.insert (CPROVER_PREFIX " pipes" );
123
+ static_symbols.insert (CPROVER_PREFIX " rounding_mode" );
124
+ static_symbols.insert (CPROVER_PREFIX " deallocated" );
125
+ static_symbols.insert (CPROVER_PREFIX " dead_object" );
126
+ static_symbols.insert (CPROVER_PREFIX " fpu_control_word" );
127
+ static_symbols.insert (CPROVER_PREFIX " jsa_jump_buffer" );
128
+ static_symbols.insert (CPROVER_PREFIX
129
+ " malloc_failure_mode_assert_then_assume" );
130
+ static_symbols.insert (CPROVER_PREFIX " malloc_failure_mode_return_null" );
131
+ static_symbols.insert (CPROVER_PREFIX " malloc_is_new_array" );
132
+ static_symbols.insert (CPROVER_PREFIX " max_malloc_size" );
133
+ static_symbols.insert (CPROVER_PREFIX " memory_leak" );
134
+ }
135
+ }
136
+
137
+ bool dfcc_is_cprover_function_symbol (const irep_idt &id)
138
+ {
139
+ init_function_symbols ();
140
+ std::string str = id2string (id);
141
+ return function_symbols.find (id) != function_symbols.end () ||
142
+ // nondet functions
143
+ has_prefix (str, " __VERIFIER" ) || has_prefix (str, " nondet" );
144
+ }
145
+
146
+ bool dfcc_is_cprover_static_symbol (const irep_idt &id)
18
147
{
148
+ init_static_symbols ();
19
149
std::string str = id2string (id);
20
- return has_prefix (str, CPROVER_PREFIX) || has_prefix (str, " __VERIFIER" ) ||
21
- has_prefix (str, " nondet" ) || has_suffix (str, " $object" );
150
+ return static_symbols.find (id) != static_symbols.end () ||
151
+ // auto objects from pointer derefs
152
+ has_suffix (str, " $object" );
22
153
}
0 commit comments