26 const std::vector<exprt> &conditions,
27 std::set<exprt> &result)
30 if(src.
id() == ID_and || src.
id() == ID_or)
32 std::vector<exprt> operands;
35 if(operands.size() == 1)
37 exprt e = *operands.begin();
40 else if(!operands.empty())
42 for(std::size_t i = 0; i < operands.size(); i++)
44 const exprt op = operands[i];
50 std::vector<exprt> others1, others2;
51 if(!conditions.empty())
57 for(std::size_t j = 0; j < operands.size(); j++)
59 others1.push_back(
not_exprt(operands[j]));
61 others2.push_back(
not_exprt(operands[j]));
63 others2.push_back((operands[j]));
71 std::vector<exprt> o = operands;
74 std::vector<exprt> new_conditions = conditions;
84 std::vector<exprt> others;
85 others.reserve(operands.size() - 1);
87 for(std::size_t j = 0; j < operands.size(); j++)
93 others.push_back(operands[j]);
97 std::vector<exprt> new_conditions = conditions;
98 new_conditions.push_back(c);
105 else if(src.
id() == ID_not)
113 std::vector<exprt> new_conditions1 = conditions;
114 new_conditions1.push_back(src);
118 std::vector<exprt> new_conditions2 = conditions;
119 new_conditions2.push_back(e);
133 std::set<exprt> result;
135 for(
const auto &d : decisions)
144 const std::set<exprt> &replacement_exprs,
145 const std::vector<exprt> &operands,
148 std::set<exprt> result;
149 for(
auto &y : replacement_exprs)
151 std::vector<exprt> others;
152 for(std::size_t j = 0; j < operands.size(); j++)
154 others.push_back(operands[j]);
171 std::set<exprt> result;
174 for(
auto &src : controlling)
176 std::set<exprt>
s1,
s2;
187 bool changed =
false;
200 std::vector<exprt> operands;
203 for(std::size_t i = 0; i < operands.size(); i++)
209 if(operands[i].
id() == ID_not)
215 std::set<exprt> ctrl_no;
223 std::set<exprt> ctrl;
224 ctrl.insert(operands[i]);
230 s2.insert(co.begin(), co.end());
248 result.insert(
s1.begin(),
s1.end());
260 std::set<signed> signs;
282 std::vector<exprt> ops;
284 for(
const auto &x : ops)
288 else if(x.id() == ID_not)
296 signs.insert(re.begin(), re.end());
302 signs.insert(re.begin(), re.end());
315 std::set<exprt> conditions;
319 conditions.insert(new_conditions.begin(), new_conditions.end());
323 std::set<exprt> new_exprs;
327 for(
auto &c : conditions)
349 for(
auto &y : new_exprs)
352 for(
auto &c : conditions)
356 int s1 = signs1.size(),
s2 = signs2.size();
365 if(
s1 == 0 &&
s2 == 0)
368 if(*(signs1.begin()) != *(signs2.begin()))
397 std::vector<exprt> operands;
400 if(src.
id() == ID_and)
402 for(
auto &x : operands)
408 else if(src.
id() == ID_or)
410 std::size_t fcount = 0;
412 for(
auto &x : operands)
416 if(fcount < operands.size())
422 else if(src.
id() == ID_not)
430 if(atomic_exprs.find(src)->second == +1)
438 std::map<exprt, signed>
441 std::map<exprt, signed> atomic_exprs;
442 for(
auto &c : conditions)
448 atomic_exprs.insert(std::pair<exprt, signed>(c, 0));
452 if(signs.size() != 1)
455 atomic_exprs.insert(std::pair<exprt, signed>(c, *signs.begin()));
468 const std::set<exprt> &conditions,
469 const exprt &decision)
477 std::map<exprt, signed> atomic_exprs_e1 =
479 std::map<exprt, signed> atomic_exprs_e2 =
483 signed cs1 = atomic_exprs_e1.find(c)->second;
484 signed cs2 = atomic_exprs_e2.find(c)->second;
486 if(cs1 == 0 || cs2 == 0)
505 auto e1_it = atomic_exprs_e1.begin();
506 auto e2_it = atomic_exprs_e2.begin();
507 while(e1_it != atomic_exprs_e1.end())
509 if(e1_it->second != e2_it->second)
527 const std::set<exprt> &expr_set,
528 const std::set<exprt> &conditions,
529 const exprt &decision)
531 for(
auto y1 : expr_set)
533 for(
auto y2 : expr_set)
551 std::set<exprt> &controlling,
552 const exprt &decision)
555 std::set<exprt> conditions;
556 for(
auto &x : controlling)
559 conditions.insert(new_conditions.begin(), new_conditions.end());
564 std::set<exprt> new_controlling;
565 bool ctrl_update =
false;
580 for(
auto &x : controlling)
583 new_controlling.clear();
584 for(
auto &y : controlling)
586 new_controlling.insert(y);
588 bool removing_x =
true;
591 for(
auto &c : conditions)
593 bool cOK =
has_mcdc_pair(c, new_controlling, conditions, decision);
615 controlling = new_controlling;
630 i_it->turn_into_skip();
637 if(!i_it->source_location().is_built_in())
642 std::set<exprt> both;
648 inserter(both, both.end()));
652 for(
const auto &p : both)
654 bool is_decision = decisions.find(p) != decisions.end();
655 bool is_condition = conditions.find(p) != conditions.end();
658 ?
"decision/condition"
659 : is_decision ?
"decision" :
"condition";
661 std::string p_string =
from_expr(
ns, function_id, p);
663 std::string comment_t = description +
" '" + p_string +
"' true";
665 *i_it = make_assertion(
not_exprt(p), source_location);
666 i_it->source_location_nonconst().set_comment(comment_t);
667 i_it->source_location_nonconst().set(
669 i_it->source_location_nonconst().set_property_class(
property_class);
670 i_it->source_location_nonconst().set_function(function_id);
672 std::string comment_f = description +
" '" + p_string +
"' false";
674 *i_it = make_assertion(p, source_location);
675 i_it->source_location_nonconst().set_comment(comment_f);
676 i_it->source_location_nonconst().set(
678 i_it->source_location_nonconst().set_property_class(
property_class);
679 i_it->source_location_nonconst().set_function(function_id);
682 std::set<exprt> controlling;
687 if(!decisions.empty())
692 for(
const auto &p : controlling)
694 std::string p_string =
from_expr(
ns, function_id, p);
696 std::string description =
697 "MC/DC independence condition '" + p_string +
"'";
700 *i_it = make_assertion(
not_exprt(p), source_location);
701 i_it->source_location_nonconst().set_comment(description);
702 i_it->source_location_nonconst().set(
704 i_it->source_location_nonconst().set_property_class(
property_class);
705 i_it->source_location_nonconst().set_function(function_id);
708 for(std::size_t i = 0; i < both.size() * 2 + controlling.size(); i++)