MCPcopy Create free account
hub / github.com/Rust-API/Rust-API-Bypass-Checker / solve_condition

Method solve_condition

src/analysis/mir_visitor/block_visitor.rs:3498–3534  ·  view source on GitHub ↗
(&mut self, cond_val: &Rc<SymbolicValue>)

Source from the content-addressed store, hash-verified

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}

Callers 1

check_condition_valueMethod · 0.80

Calls 8

stateMethod · 0.80
assertMethod · 0.80
get_as_z3_expressionMethod · 0.80
convert_to_bool_sortMethod · 0.80
solve_expressionMethod · 0.80
resetMethod · 0.80

Tested by

no test coverage detected