CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
dfcc_is_fresh.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module: Dynamic frame condition checking for function contracts
4
5Author: Remi Delmas, delmasrd@amazon.com
6Date: August 2022
7
8\*******************************************************************/
9
10#include "dfcc_is_fresh.h"
11
12#include <util/cprover_prefix.h>
13#include <util/pointer_expr.h>
14#include <util/prefix.h>
15#include <util/suffix.h>
16#include <util/symbol.h>
17
18#include "dfcc_cfg_info.h"
19#include "dfcc_library.h"
20
22 dfcc_libraryt &library,
23 message_handlert &message_handler)
24 : library(library), message_handler(message_handler), log(message_handler)
25{
26}
27
29 goto_programt &program,
30 dfcc_cfg_infot &cfg_info)
31{
33 program,
34 program.instructions.begin(),
35 program.instructions.end(),
36 cfg_info);
37}
38
40 goto_programt &program,
43 dfcc_cfg_infot &cfg_info)
44{
45 auto &target = first_instruction;
46 while(target != last_instruction)
47 {
48 if(target->is_function_call())
49 {
50 const auto &function = target->call_function();
51
52 if(function.id() == ID_symbol)
53 {
54 const irep_idt &fun_name = to_symbol_expr(function).get_identifier();
56 {
57 // add address on first operand
58 target->call_arguments()[0] =
59 address_of_exprt(target->call_arguments()[0]);
60
61 // fix the function name.
62 to_symbol_expr(target->call_function())
63 .set_identifier(library.dfcc_fun_symbol[dfcc_funt::IS_FRESH].name);
64
65 // pass the may_fail flag
66 if(function.source_location().get_bool("no_fail"))
67 target->call_arguments().push_back(false_exprt());
68 else
69 target->call_arguments().push_back(true_exprt());
70
71 // pass the write_set
72 target->call_arguments().push_back(cfg_info.get_write_set(target));
73 }
74 }
75 }
76 target++;
77 }
78}
Operator to return the address of an object.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
Computes natural loops, enforces normal form conditions, computes the nesting graph,...
const exprt & get_write_set(goto_programt::const_targett target) const
Returns the write set variable to use for the given instruction Returns the write set for the loop,...
dfcc_libraryt & library
void rewrite_calls(goto_programt &program, dfcc_cfg_infot &cfg_info)
Rewrites calls to is_fresh predicates into calls to the library implementation in the given program,...
dfcc_is_fresht(dfcc_libraryt &library, message_handlert &message_handler)
Class interface to library types and functions defined in cprover_contracts.c.
std::map< dfcc_funt, symbolt > dfcc_fun_symbol
Maps enum values to the actual function symbols (dynamically loaded)
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition dstring.h:38
The Boolean constant false.
Definition std_expr.h:3199
A generic container class for the GOTO intermediate representation of one function.
instructionst instructions
The list of instructions in the goto program.
instructionst::iterator targett
The Boolean constant true.
Definition std_expr.h:3190
bool has_prefix(const std::string &s, const std::string &prefix)
Definition converter.cpp:13
#define CPROVER_PREFIX
Class that computes CFG information about the loop structure of a GOTO function for the purpose of dy...
Instruments occurrences of is_fresh predicates in programs encoding requires and ensures clauses of c...
Dynamic frame condition checking library loading.
const std::string & id2string(const irep_idt &d)
Definition irep.h:44
double log(double x)
Definition math.c:2449
API to expression classes for Pointers.
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
Definition std_expr.h:272
Symbol table entry.