(
&mut self,
term: &Terminator<'tcx>,
abstract_value: &AbstractDomain<DomainType>,
)
| 68 | IntervalAbstractDomain<DomainType>: GetDomainType, |
| 69 | { |
| 70 | fn run_terminator( |
| 71 | &mut self, |
| 72 | term: &Terminator<'tcx>, |
| 73 | abstract_value: &AbstractDomain<DomainType>, |
| 74 | ) { |
| 75 | let Terminator { source_info, kind } = term; |
| 76 | let span = source_info.span; |
| 77 | if let TerminatorKind::Assert { |
| 78 | cond, |
| 79 | expected, |
| 80 | msg, |
| 81 | .. |
| 82 | } = &kind |
| 83 | { |
| 84 | debug!( |
| 85 | "Checking assertion: {:?} with message: {:?}, exptected: {}", |
| 86 | term, msg, expected |
| 87 | ); |
| 88 | debug!("Current state: {:?}", abstract_value); |
| 89 | |
| 90 | if let Some(place) = cond.place() { |
| 91 | if let Some(cond_val) = self.body_visitor.place_to_abstract_value.get(&place) { |
| 92 | debug!("place: {:?}, cond_val: {:?}", place, cond_val); |
| 93 | let cond_val = cond_val.clone(); |
| 94 | let check_result = match msg.deref() { |
| 95 | mir::AssertKind::Overflow(..) => { |
| 96 | self.check_overflow(cond_val.clone(), *expected, abstract_value) |
| 97 | } |
| 98 | mir::AssertKind::MisalignedPointerDereference { .. } => { |
| 99 | return; |
| 100 | } |
| 101 | _ => self.check_assert_condition(cond_val, *expected, abstract_value), |
| 102 | }; |
| 103 | |
| 104 | match check_result { |
| 105 | CheckerResult::Safe => (), |
| 106 | CheckerResult::Unsafe => { |
| 107 | let error = self.body_visitor.context.session.dcx().struct_span_warn( |
| 108 | span, |
| 109 | format!( |
| 110 | "[Bypasser] Provably error: {:?}", |
| 111 | self.body_visitor.recover_var_name(msg.deref()) |
| 112 | ), |
| 113 | ); |
| 114 | self.body_visitor.emit_diagnostic( |
| 115 | error, |
| 116 | false, |
| 117 | DiagnosticCause::from(msg.deref()), |
| 118 | ); |
| 119 | } |
| 120 | CheckerResult::Warning => { |
| 121 | // let warning = self.body_visitor.context.session.dcx().struct_span_warn( |
| 122 | // span, |
| 123 | // format!( |
| 124 | // "[Bypasser] Possible error: {:?}", |
| 125 | // self.body_visitor.recover_var_name(msg.deref()) |
| 126 | // ), |
| 127 | // ); |
no test coverage detected