(&mut self, cond_val: &Rc<SymbolicValue>)
| 3496 | } |
| 3497 | |
| 3498 | fn solve_condition(&mut self, cond_val: &Rc<SymbolicValue>) -> Option<bool> { |
| 3499 | let constraint_system = LinearConstraintSystem::from(&self.state().numerical_domain); |
| 3500 | |
| 3501 | let sat; |
| 3502 | let solver = &self.body_visitor.z3_solver; |
| 3503 | for cst in &constraint_system { |
| 3504 | debug!("Adding numerical constraint to SMT solver: {:?}", cst); |
| 3505 | solver.assert(&solver.get_as_z3_expression(cst)); |
| 3506 | } |
| 3507 | |
| 3508 | let z3_cond_expr = |
| 3509 | solver.convert_to_bool_sort(solver.get_symbolic_as_z3_expression(cond_val)); |
| 3510 | |
| 3511 | match solver.solve_expression(&z3_cond_expr) { |
| 3512 | SmtResult::Unsat => { |
| 3513 | // `cond_val` is always false |
| 3514 | sat = Some(false); |
| 3515 | } |
| 3516 | SmtResult::Sat => { |
| 3517 | // `cond_val` is satisfiable, now check whether `not cond_val` is always false |
| 3518 | // cst = cst.negate(); |
| 3519 | let cst = solver.make_not_z3_expression(z3_cond_expr); |
| 3520 | if solver.solve_expression(&cst) == SmtResult::Unsat { |
| 3521 | // `not cond_val` is always false, so `cond_val` is always true |
| 3522 | sat = Some(true); |
| 3523 | } else { |
| 3524 | sat = None |
| 3525 | } |
| 3526 | } |
| 3527 | SmtResult::Unknown => { |
| 3528 | sat = None; |
| 3529 | } |
| 3530 | } |
| 3531 | solver.reset(); |
| 3532 | |
| 3533 | sat |
| 3534 | } |
| 3535 | } |
no test coverage detected