Skip to content

Commit 81c211c

Browse files
committed
clear memory on unknown write.
1 parent daa9982 commit 81c211c

File tree

1 file changed

+35
-2
lines changed

1 file changed

+35
-2
lines changed

src/evaluator.rs

+35-2
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ impl Evaluator {
155155
.collect::<Vec<_>>();
156156
let result = match (builtin.name, &arg_values[..]) {
157157
(
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",
159159
_
160160
// TODO fewer clones
161161
) => Some(Value::Op(builtin.name, arg_values.to_vec())),
@@ -164,6 +164,7 @@ impl Evaluator {
164164
if let Value::DataRef(offset) = &offset[0] {
165165
self.memory_slices.insert(addr.clone(), Value::DataRef(offset.clone()));
166166
}
167+
self.unknown_memory_write_above(addr);
167168
None
168169
}
169170
("calldatasize", []) => {
@@ -193,10 +194,22 @@ impl Evaluator {
193194
self.write_memory(addr.clone(), Some(value.clone()));
194195
None
195196
}
197+
("mstore", ..) => {
198+
println!("Unknown memory write!");
199+
self.unknown_memory_write();
200+
None
201+
}
196202
("mload", [Value::Concrete(addr)]) => {
197203
//println!("mload({})", addr);
198204
self.read_memory(addr)
199205
}
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+
}
200213
("sstore", [Value::Concrete(addr), value]) => {
201214
//println!("sstore({}, {})", addr, value);
202215
self.storage.insert(addr.clone(), value.clone());
@@ -206,7 +219,18 @@ impl Evaluator {
206219
//println!("sload({})", addr);
207220
self.storage.get(addr).cloned()
208221
}
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+
}
210234
};
211235
if let Some(result) = result.map(simplify) {
212236
self.ssa_values.insert(return_vars[0].name.clone(), result);
@@ -351,6 +375,15 @@ impl Evaluator {
351375
}
352376
})
353377
}
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+
}
354387
}
355388

356389
fn wrap(mut x: BigUint) -> BigUint {

0 commit comments

Comments
 (0)