|
| static void | collect_address_taken (const expr2tc &expr, rw_sett::shared_localst &out) |
| static expr2tc | lvalue_root (const expr2tc &e) |
| static void | collect_thread_escaped_locals (const goto_programt &goto_program, const namespacet &ns, rw_sett::shared_localst &out) |
| static bool | mentions_symbol (const expr2tc &e, const irep_idt &name) |
| static escaping_paramst | compute_escaping_params (const goto_functionst &goto_functions, const namespacet &ns) |
| static void | collect_escapes_through_calls (const goto_functionst &goto_functions, const escaping_paramst &esc, rw_sett::shared_localst &out) |
| static void | collect_address_taken_functions (const expr2tc &e, const goto_functionst &goto_functions, std::set< irep_idt > &escaped) |
| static void | collect_callees (const goto_programt &body, std::set< irep_idt > &out) |
| | Direct callees of body, plus every function whose address it takes (a function pointer may be called from anywhere, so counting it as a callee only ever over-approximates reachability).
|
| static std::set< irep_idt > | closure (const goto_functionst &goto_functions, const std::set< irep_idt > &seeds) |
| static std::set< irep_idt > | compute_pre_thread_functions (const goto_functionst &goto_functions) |
| | Functions that provably run before any thread exists.
|
| static std::set< irep_idt > | compute_always_atomic_functions (const goto_functionst &goto_functions) |
| static bool | call_runs_body (const expr2tc &code, const namespacet &ns) |
| static bool | has_write (const rw_sett &rw_set) |
| static bool | stores_call_result_in_shared (const goto_programt::instructiont &instruction, const rw_sett &rw_set, const namespacet &ns) |
| static bool | emitted_after_atomic_block (const goto_programt::instructiont &instruction, const namespacet &ns) |
| static bool | is_exception_dispatch (const goto_programt::instructiont &instruction) |
| static void | store_call_result_via_local (contextt &context, goto_programt &goto_program, goto_programt::targett call_it, symbol_generator &tmp_sym) |
| static goto_programt::instructiont | yield_instruction (contextt &context, const locationt &location) |
| void | add_race_assertions (contextt &context, goto_programt &goto_program, w_guardst &w_guards, const rw_sett::shared_localst &shared_locals, bool body_is_atomic, symbol_generator &tmp_sym) |
| void | add_race_assertions (contextt &context, goto_programt &goto_program) |
| static void | yield_after_lock_releases (contextt &context, goto_functionst &goto_functions) |
| | A release lets another thread acquire before the releasing one runs on.
|
| void | add_race_assertions (contextt &context, goto_functionst &goto_functions) |
Functions that provably run before any thread exists.
__ESBMC_main performs the program's initialisation and then calls the entry point; only code reachable from the entry point ever creates a thread. So everything __ESBMC_main calls before its first spawn-reaching callee runs single-threaded, and those accesses cannot race with anything.
Worth suppressing rather than merely correct to suppress: each instrumented access costs a yield and two updates of the (infinite) race-flag array, and the Python frontend's generated python_init alone carries ~78 of them (github #6610). A function that also runs after the entry point is excluded, so this never hides an access that could race.