@@ -155,7 +155,7 @@ impl Evaluator {
155
155
. collect :: < Vec < _ > > ( ) ;
156
156
let result = match ( builtin. name , & arg_values[ ..] ) {
157
157
(
158
- "add" | "sub" | "mul" | "div" | "shl" | "shr" | "and" | "or" | "datasize" | "dataoffset" | "not" | "iszero" ,
158
+ "add" | "sub" | "mul" | "div" | "shl" | "shr" | "and" | "or" | "datasize" | "dataoffset" | "not" | "iszero" | "lt" | "gt" | "slt" | "sgt" | "eq" | "callvalue" ,
159
159
_
160
160
// TODO fewer clones
161
161
) => Some ( Value :: Op ( builtin. name , arg_values. to_vec ( ) ) ) ,
@@ -164,6 +164,7 @@ impl Evaluator {
164
164
if let Value :: DataRef ( offset) = & offset[ 0 ] {
165
165
self . memory_slices . insert ( addr. clone ( ) , Value :: DataRef ( offset. clone ( ) ) ) ;
166
166
}
167
+ self . unknown_memory_write_above ( addr) ;
167
168
None
168
169
}
169
170
( "calldatasize" , [ ] ) => {
@@ -193,10 +194,22 @@ impl Evaluator {
193
194
self . write_memory ( addr. clone ( ) , Some ( value. clone ( ) ) ) ;
194
195
None
195
196
}
197
+ ( "mstore" , ..) => {
198
+ println ! ( "Unknown memory write!" ) ;
199
+ self . unknown_memory_write ( ) ;
200
+ None
201
+ }
196
202
( "mload" , [ Value :: Concrete ( addr) ] ) => {
197
203
//println!("mload({})", addr);
198
204
self . read_memory ( addr)
199
205
}
206
+ ( "returndatacopy" , ..) => {
207
+ println ! ( "Unknown memory write!" ) ;
208
+ // TODO: Problem: If we have an unknown memory write and join this with another
209
+ // branch, we also do need to clear that memory!
210
+ self . unknown_memory_write ( ) ;
211
+ None
212
+ }
200
213
( "sstore" , [ Value :: Concrete ( addr) , value] ) => {
201
214
//println!("sstore({}, {})", addr, value);
202
215
self . storage . insert ( addr. clone ( ) , value. clone ( ) ) ;
@@ -206,7 +219,18 @@ impl Evaluator {
206
219
//println!("sload({})", addr);
207
220
self . storage . get ( addr) . cloned ( )
208
221
}
209
- _ => None ,
222
+ ( "revert" , ..) => {
223
+ println ! ( "Reverted!" ) ;
224
+ None
225
+ }
226
+ ( "return" , ..) => {
227
+ println ! ( "Returned!" ) ;
228
+ None
229
+ }
230
+ ( op, ..) => {
231
+ println ! ( "Unhandled opcode: {op}" ) ;
232
+ None
233
+ }
210
234
} ;
211
235
if let Some ( result) = result. map ( simplify) {
212
236
self . ssa_values . insert ( return_vars[ 0 ] . name . clone ( ) , result) ;
@@ -351,6 +375,15 @@ impl Evaluator {
351
375
}
352
376
} )
353
377
}
378
+
379
+ fn unknown_memory_write ( & mut self ) {
380
+ self . memory . clear ( ) ;
381
+ self . unknown_memory_is_zero = false ;
382
+ }
383
+ fn unknown_memory_write_above ( & mut self , offset : & BigUint ) {
384
+ self . memory . retain ( |addr, _| addr < offset) ;
385
+ self . unknown_memory_is_zero = false ;
386
+ }
354
387
}
355
388
356
389
fn wrap ( mut x : BigUint ) -> BigUint {
0 commit comments