@@ -14,9 +14,141 @@ Date: March 2023
1414#include < util/prefix.h>
1515#include < util/suffix.h>
1616
17- bool dfcc_is_cprover_symbol (const irep_idt &id)
17+ #include < unordered_set>
18+
19+ static void
20+ init_function_symbols (std::unordered_set<irep_idt> &function_symbols)
21+ {
22+ // the set of all CPROVER symbols that we know of
23+ if (function_symbols.empty ())
24+ {
25+ function_symbols.insert (CPROVER_PREFIX " _start" );
26+ function_symbols.insert (CPROVER_PREFIX " array_copy" );
27+ function_symbols.insert (CPROVER_PREFIX " array_replace" );
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 (std::unordered_set<irep_idt> &static_symbols)
118+ {
119+ if (static_symbols.empty ())
120+ {
121+ static_symbols.insert (CPROVER_PREFIX " dead_object" );
122+ static_symbols.insert (CPROVER_PREFIX " deallocated" );
123+ static_symbols.insert (CPROVER_PREFIX " fpu_control_word" );
124+ static_symbols.insert (CPROVER_PREFIX " jsa_jump_buffer" );
125+ static_symbols.insert (CPROVER_PREFIX " malloc_failure_mode_return_null" );
126+ static_symbols.insert (CPROVER_PREFIX
127+ " malloc_failure_mode_assert_then_assume" );
128+ static_symbols.insert (CPROVER_PREFIX " malloc_is_new_array" );
129+ static_symbols.insert (CPROVER_PREFIX " max_malloc_size" );
130+ static_symbols.insert (CPROVER_PREFIX " memory_leak" );
131+ static_symbols.insert (CPROVER_PREFIX " pipe_offset" );
132+ static_symbols.insert (CPROVER_PREFIX " pipes" );
133+ static_symbols.insert (CPROVER_PREFIX " rounding_mode" );
134+ }
135+ }
136+
137+ bool dfcc_is_cprover_function_symbol (const irep_idt &id)
18138{
139+ std::unordered_set<irep_idt> function_symbols;
140+ init_function_symbols (function_symbols);
19141 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" );
142+ return function_symbols.find (id) != function_symbols.end () ||
143+ // nondet functions
144+ has_prefix (str, " __VERIFIER" ) || has_prefix (str, " nondet" );
145+ }
146+
147+ bool dfcc_is_cprover_static_symbol (const irep_idt &id)
148+ {
149+ std::unordered_set<irep_idt> static_symbols;
150+ init_static_symbols (static_symbols);
151+ return static_symbols.find (id) != static_symbols.end () ||
152+ // auto objects from pointer derefs
153+ has_suffix (id2string (id), " $object" );
22154}
0 commit comments