39 exprt normalized_expr = expr;
42 bool checked_when_taken =
true;
45 while(normalized_expr.
id() == ID_not)
48 checked_when_taken = !checked_when_taken;
51 if(normalized_expr.
id() == ID_equal)
53 normalized_expr.
id(ID_notequal);
54 checked_when_taken = !checked_when_taken;
57 if(normalized_expr.
id() == ID_notequal)
62 if(op0.
type().
id() == ID_pointer &&
65 return { { checked_when_taken, op1 } };
68 if(op1.
type().
id() == ID_pointer &&
71 return { { checked_when_taken, op0 } };
85 std::set<exprt, type_comparet> checked_expressions(
type_comparet{});
90 if(instruction.incoming_edges.size() > 1)
91 checked_expressions.clear();
93 else if(instruction.is_target())
97 checked_expressions = findit->second;
100 checked_expressions = std::set<exprt, type_comparet>(
type_comparet{});
105 if(!checked_expressions.empty())
108 instruction.location_number, checked_expressions);
111 switch(instruction.type())
132 if(assume_check->checked_when_taken)
133 checked_expressions.insert(assume_check->checked_expr);
139 if(!instruction.is_backwards_goto())
143 auto target_emplace_result =
145 instruction.get_target()->location_number, checked_expressions);
149 if(target_emplace_result.second)
152 auto conditional_check =
157 if(conditional_check->checked_when_taken)
159 target_emplace_result.first->second.insert(
160 conditional_check->checked_expr);
163 checked_expressions.insert(conditional_check->checked_expr);
179 checked_expressions.clear();
195 for(
const auto &instruction : goto_program.
instructions)
197 out <<
"**** " << instruction.location_number <<
" "
198 << instruction.source_location() <<
"\n";
200 out <<
"Non-null expressions: ";
209 for(
const exprt &expr : findit->second)
220 instruction.output(out);
239 for(
const auto &instruction : goto_program.
instructions)
241 out <<
"**** " << instruction.location_number <<
" "
242 << instruction.source_location() <<
"\n";
244 out <<
"Safe (known-not-null) dereferences: ";
253 instruction.apply([&first, &out](
const exprt &e) {
255 subexpr_it != subexpr_end;
258 if(subexpr_it->id() == ID_dereference)
263 format_rec(out, to_dereference_expr(*subexpr_it).pointer());
271 instruction.output(out);