CBMC
cover_instrument_decision.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Coverage Instrumentation
4 
5 Author: Daniel Kroening
6 
7 \*******************************************************************/
8 
11 
12 #include "cover_instrument.h"
13 
14 #include <langapi/language_util.h>
15 
16 #include "cover_util.h"
17 
19  const irep_idt &function_id,
20  goto_programt &goto_program,
22  const cover_blocks_baset &,
23  const assertion_factoryt &make_assertion) const
24 {
25  if(is_non_cover_assertion(i_it))
26  i_it->turn_into_skip();
27 
28  // Decisions are maximal Boolean combinations of conditions.
29  if(!i_it->source_location().is_built_in())
30  {
31  const std::set<exprt> decisions = collect_decisions(i_it);
32 
33  source_locationt source_location = i_it->source_location();
34 
35  for(const auto &d : decisions)
36  {
37  const std::string d_string = from_expr(ns, function_id, d);
38 
39  const std::string comment_t = "decision '" + d_string + "' true";
40  goto_program.insert_before_swap(i_it);
41  initialize_source_location(source_location, comment_t, function_id);
42  *i_it = make_assertion(d, source_location);
43 
44  const std::string comment_f = "decision '" + d_string + "' false";
45  goto_program.insert_before_swap(i_it);
46  initialize_source_location(source_location, comment_f, function_id);
47  *i_it = make_assertion(not_exprt(d), source_location);
48  }
49 
50  // advance iterator beyond the inserted instructions
51  for(std::size_t i = 0; i < decisions.size() * 2; i++)
52  i_it++;
53  }
54 }
void instrument(const irep_idt &function_id, goto_programt &, goto_programt::targett &, const cover_blocks_baset &, const assertion_factoryt &) const override
Override this method to implement an instrumenter.
bool is_non_cover_assertion(goto_programt::const_targett t) const
void initialize_source_location(source_locationt &source_location, const std::string &comment, const irep_idt &function_id) const
std::function< goto_programt::instructiont(const exprt &, const source_locationt &)> assertion_factoryt
The type of function used to make goto_program assertions.
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:38
A generic container class for the GOTO intermediate representation of one function.
Definition: goto_program.h:73
void insert_before_swap(targett target)
Insertion that preserves jumps to "target".
Definition: goto_program.h:643
instructionst::iterator targett
Definition: goto_program.h:614
Boolean negation.
Definition: std_expr.h:2337
Coverage Instrumentation.
std::set< exprt > collect_decisions(const goto_programt::const_targett t)
Definition: cover_util.cpp:98
Coverage Instrumentation Utilities.
std::string from_expr(const namespacet &ns, const irep_idt &identifier, const exprt &expr)