11use crate :: error:: CrackersError ;
22use crate :: synthesis:: builder:: { StateConstraintGenerator , TransitionConstraintGenerator } ;
33use jingle:: modeling:: { ModeledBlock , ModelingContext , State } ;
4- use jingle:: sleigh:: { ArchInfoProvider , VarNode } ;
4+ use jingle:: sleigh:: { SleighArchInfo , VarNode } ;
55use jingle:: varnode:: { ResolvedIndirectVarNode , ResolvedVarnode } ;
66#[ cfg( feature = "pyo3" ) ]
77use pyo3:: pyclass;
88use serde:: { Deserialize , Serialize } ;
9+ use std:: borrow:: Borrow ;
910use std:: collections:: HashMap ;
1011use std:: ops:: Add ;
1112use std:: sync:: Arc ;
@@ -21,22 +22,23 @@ pub struct ConstraintConfig {
2122}
2223
2324impl ConstraintConfig {
24- pub fn get_preconditions < ' a , T : ArchInfoProvider > (
25- & ' a self ,
26- sleigh : & ' a T ,
27- ) -> impl Iterator < Item = Arc < StateConstraintGenerator > > + ' a {
25+ pub fn get_preconditions < T : Borrow < SleighArchInfo > > (
26+ & self ,
27+ sleigh : T ,
28+ ) -> impl Iterator < Item = Arc < StateConstraintGenerator > > {
29+ let sleigh = sleigh. borrow ( ) . clone ( ) ;
2830 self . precondition
2931 . iter ( )
30- . flat_map ( |c| c. constraints ( sleigh, self . pointer . clone ( ) ) )
32+ . flat_map ( move |c| c. constraints ( sleigh. clone ( ) , self . pointer . clone ( ) ) )
3133 }
3234
33- pub fn get_postconditions < ' a , T : ArchInfoProvider > (
34- & ' a self ,
35- sleigh : & ' a T ,
36- ) -> impl Iterator < Item = Arc < StateConstraintGenerator > > + ' a {
35+ pub fn get_postconditions < T : Borrow < SleighArchInfo > > (
36+ & self ,
37+ sleigh : T ,
38+ ) -> impl Iterator < Item = Arc < StateConstraintGenerator > > {
3739 self . postcondition
3840 . iter ( )
39- . flat_map ( |c| c. constraints ( sleigh, self . pointer . clone ( ) ) )
41+ . flat_map ( move |c| c. constraints ( sleigh. borrow ( ) . clone ( ) , self . pointer . clone ( ) ) )
4042 }
4143
4244 pub fn get_pointer_constraints (
@@ -55,14 +57,17 @@ pub struct StateEqualityConstraint {
5557}
5658
5759impl StateEqualityConstraint {
58- pub fn constraints < ' a , T : ArchInfoProvider > (
59- & ' a self ,
60- sleigh : & ' a T ,
60+ pub fn constraints < T : Borrow < SleighArchInfo > > (
61+ & self ,
62+ info : T ,
6163 c : Option < PointerRangeConstraints > ,
62- ) -> impl Iterator < Item = Arc < StateConstraintGenerator > > + ' a {
63- let register_iterator = self . register . iter ( ) . flat_map ( |map| {
64- map. iter ( ) . filter_map ( |( name, value) | {
65- if let Some ( vn) = sleigh. get_register ( name) {
64+ ) -> impl Iterator < Item = Arc < StateConstraintGenerator > > {
65+ let info = info. borrow ( ) . clone ( ) ;
66+ let info2 = info. clone ( ) ;
67+ let register_iterator = self . register . iter ( ) . flat_map ( move |map| {
68+ let info = info. clone ( ) ;
69+ map. iter ( ) . filter_map ( move |( name, value) | {
70+ if let Some ( vn) = info. register ( name) {
6671 Some ( Arc :: new ( gen_register_constraint ( vn. clone ( ) , * value as u64 ) )
6772 as Arc < StateConstraintGenerator > )
6873 } else {
@@ -75,10 +80,12 @@ impl StateEqualityConstraint {
7580 . memory
7681 . iter ( )
7782 . map ( |c| Arc :: new ( gen_memory_constraint ( c. clone ( ) ) ) as Arc < StateConstraintGenerator > ) ;
83+ let info = info2;
7884 let pointer_iterator = self . pointer . iter ( ) . flat_map ( move |map| {
7985 let c1 = c. clone ( ) ;
86+ let info = info. clone ( ) ;
8087 map. iter ( ) . filter_map ( move |( name, value) | {
81- if let Some ( vn) = sleigh . get_register ( name) {
88+ if let Some ( vn) = info . register ( name) {
8289 Some ( Arc :: new ( gen_register_pointer_constraint (
8390 vn. clone ( ) ,
8491 value. clone ( ) ,
@@ -129,7 +136,12 @@ pub fn gen_memory_constraint(
129136 m : MemoryEqualityConstraint ,
130137) -> impl Fn ( & State , u64 ) -> Result < Bool , CrackersError > + Send + Sync + Clone + ' static {
131138 move |state, _addr| {
132- let data = state. read_varnode ( & state. varnode ( & m. space , m. address , m. size ) . unwrap ( ) ) ?;
139+ let data = state. read_varnode (
140+ & state
141+ . arch_info ( )
142+ . varnode ( & m. space , m. address , m. size )
143+ . unwrap ( ) ,
144+ ) ?;
133145 let constraint = data. eq ( BV :: from_u64 ( m. value as u64 , data. get_size ( ) ) ) ;
134146 Ok ( constraint)
135147 }
@@ -166,15 +178,15 @@ pub fn gen_register_pointer_constraint(
166178 pointer_location : vn. clone ( ) ,
167179 pointer : pointer. clone ( ) . add ( i as u64 ) ,
168180 access_size_bytes : 1 ,
169- pointer_space_idx : state. get_code_space_idx ( ) ,
181+ pointer_space_idx : state. get_default_code_space_info ( ) . index ,
170182 } ) ;
171183 let actual = state. read_resolved ( & char_ptr) ?;
172184 bools. push ( actual. eq ( & expected) )
173185 }
174186 let pointer = state. read_varnode ( & vn) ?;
175187 let resolved = ResolvedVarnode :: Indirect ( ResolvedIndirectVarNode {
176188 pointer_location : vn. clone ( ) ,
177- pointer_space_idx : state. get_code_space_idx ( ) ,
189+ pointer_space_idx : state. get_default_code_space_info ( ) . index ,
178190 access_size_bytes : value. len ( ) ,
179191 pointer,
180192 } ) ;
@@ -199,7 +211,8 @@ pub fn gen_pointer_range_state_invariant(
199211 match vn {
200212 ResolvedVarnode :: Direct ( d) => {
201213 // todo: this is gross
202- let should_constrain = state. get_code_space_idx ( ) == d. space_index ;
214+ let should_constrain =
215+ state. arch_info ( ) . default_code_space_index ( ) == d. space_index ;
203216 match should_constrain {
204217 false => Ok ( None ) ,
205218 true => {
0 commit comments