cprover
cover_instrument_condition.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 #include "cover_basic_blocks.h"
18 
20  const irep_idt &function_id,
21  goto_programt &goto_program,
23  const cover_blocks_baset &,
24  const assertion_factoryt &make_assertion) const
25 {
26  if(is_non_cover_assertion(i_it))
27  i_it->turn_into_skip();
28 
29  // Conditions are all atomic predicates in the programs.
30  if(!i_it->source_location.is_built_in())
31  {
32  const std::set<exprt> conditions = collect_conditions(i_it);
33 
34  const source_locationt source_location = i_it->source_location;
35 
36  for(const auto &c : conditions)
37  {
38  const std::string c_string = from_expr(ns, function_id, c);
39 
40  const std::string comment_t = "condition '" + c_string + "' true";
41  goto_program.insert_before_swap(i_it);
42  *i_it = make_assertion(c, source_location);
43  initialize_source_location(i_it, comment_t, function_id);
44 
45  const std::string comment_f = "condition '" + c_string + "' false";
46  goto_program.insert_before_swap(i_it);
47  *i_it = make_assertion(not_exprt(c), source_location);
48  initialize_source_location(i_it, comment_f, function_id);
49  }
50 
51  for(std::size_t i = 0; i < conditions.size() * 2; i++)
52  i_it++;
53  }
54 }
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:37
cover_instrumenter_baset::is_non_cover_assertion
bool is_non_cover_assertion(goto_programt::const_targett t) const
Definition: cover_instrument.h:93
cover_instrumenter_baset::initialize_source_location
void initialize_source_location(goto_programt::targett t, const std::string &comment, const irep_idt &function_id) const
Definition: cover_instrument.h:82
cover_instrumenter_baset::ns
const namespacet ns
Definition: cover_instrument.h:71
language_util.h
cover_instrument.h
Coverage Instrumentation.
cover_blocks_baset
Definition: cover_basic_blocks.h:24
collect_conditions
std::set< exprt > collect_conditions(const exprt &src)
Definition: cover_util.cpp:42
cover_instrumenter_baset::assertion_factoryt
std::function< goto_programt::instructiont(const exprt &, const source_locationt &)> assertion_factoryt
The type of function used to make goto_program assertions.
Definition: cover_instrument.h:41
source_locationt
Definition: source_location.h:20
cover_condition_instrumentert::instrument
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.
Definition: cover_instrument_condition.cpp:19
cover_basic_blocks.h
Basic blocks detection for Coverage Instrumentation.
goto_programt
A generic container class for the GOTO intermediate representation of one function.
Definition: goto_program.h:73
goto_programt::insert_before_swap
void insert_before_swap(targett target)
Insertion that preserves jumps to "target".
Definition: goto_program.h:606
cover_util.h
Coverage Instrumentation Utilities.
from_expr
std::string from_expr(const namespacet &ns, const irep_idt &identifier, const exprt &expr)
Definition: language_util.cpp:20
goto_programt::targett
instructionst::iterator targett
Definition: goto_program.h:579
not_exprt
Boolean negation.
Definition: std_expr.h:2843