bool path_searcht::drop_state(const statet &state) const { // depth if(depth_limit!=-1 && state.get_depth()>depth_limit) return true; // context bound if(context_bound!=-1 && state.get_no_thread_interleavings()) return true; // unwinding limit -- loops if(unwind_limit!=-1 && state.get_instruction()->is_backwards_goto()) { for(path_symex_statet::unwinding_mapt::const_iterator it=state.unwinding_map.begin(); it!=state.unwinding_map.end(); it++) if(it->second>unwind_limit) return true; } // unwinding limit -- recursion if(unwind_limit!=-1 && state.get_instruction()->is_function_call()) { for(path_symex_statet::recursion_mapt::const_iterator it=state.recursion_map.begin(); it!=state.recursion_map.end(); it++) if(it->second>unwind_limit) return true; } return false; }
/// decide whether to drop a state bool path_searcht::drop_state(const statet &state) { goto_programt::const_targett pc=state.get_instruction(); // depth limit if(depth_limit_set && state.get_depth()>depth_limit) return true; // context bound if(context_bound_set && state.get_no_thread_interleavings()>context_bound) return true; // branch bound if(branch_bound_set && state.get_no_branches()>branch_bound) return true; // unwinding limit -- loops if(unwind_limit_set && state.get_instruction()->is_backwards_goto()) { for(const auto &loop_info : state.unwinding_map) if(loop_info.second>unwind_limit) return true; } // unwinding limit -- recursion if(unwind_limit_set && state.get_instruction()->is_function_call()) { for(const auto &rec_info : state.recursion_map) if(rec_info.second>unwind_limit) return true; } if(pc->is_assume() && simplify_expr(pc->guard, ns).is_false()) { debug() << "aborting path on assume(false) at " << pc->source_location << " thread " << state.get_current_thread(); const irep_idt &c=pc->source_location.get_comment(); if(!c.empty()) debug() << ": " << c; debug() << eom; return true; } return false; }