def get_mem_overlapping(self, e, eval_cache=None): if eval_cache is None: eval_cache = {} if not isinstance(e, m2_expr.ExprMem): raise ValueError('mem overlap bad arg') ov = [] # suppose max mem size is 64 bytes, compute all reachable addresses to_test = [] base_ptr = self.expr_simp(e.arg) for i in xrange(-7, e.size / 8): ex = self.expr_simp( self.eval_expr(base_ptr + m2_expr.ExprInt_from(e.arg, i), eval_cache)) to_test.append((i, ex)) for i, x in to_test: if not x in self.symbols.symbols_mem: continue ex = self.expr_simp(self.eval_expr(e.arg - x, eval_cache)) if not isinstance(ex, m2_expr.ExprInt): raise ValueError('ex is not ExprInt') ptr_diff = int32(ex.arg) if ptr_diff >= self.symbols.symbols_mem[x][1].size / 8: # print "too long!" continue ov.append((i, self.symbols.symbols_mem[x][0])) return ov
def get_mem_overlapping(self, e, eval_cache=None): if eval_cache is None: eval_cache = {} if not isinstance(e, m2_expr.ExprMem): raise ValueError('mem overlap bad arg') ov = [] # suppose max mem size is 64 bytes, compute all reachable addresses to_test = [] base_ptr = self.expr_simp(e.arg) for i in xrange(-7, e.size / 8): ex = self.expr_simp( self.eval_expr(base_ptr + m2_expr.ExprInt_from(e.arg, i), eval_cache)) to_test.append((i, ex)) for i, x in to_test: if not x in self.symbols.symbols_mem: continue ex = self.expr_simp(self.eval_expr(e.arg - x, eval_cache)) if not isinstance(ex, m2_expr.ExprInt): raise ValueError('ex is not ExprInt') ptr_diff = int32(ex.arg) if ptr_diff >= self.symbols.symbols_mem[x][1].size / 8: # print "too long!" continue ov.append((i, self.symbols.symbols_mem[x][0])) return ov
def substract_mems(self, a, b): ex = b.arg - a.arg ex = self.expr_simp(self.eval_expr(ex, {})) if not isinstance(ex, m2_expr.ExprInt): return None ptr_diff = int(int32(ex.arg)) out = [] if ptr_diff < 0: # [a ] #[b ]XXX sub_size = b.size + ptr_diff * 8 if sub_size >= a.size: pass else: ex = m2_expr.ExprOp('+', a.arg, m2_expr.ExprInt_from(a.arg, sub_size / 8)) ex = self.expr_simp(self.eval_expr(ex, {})) rest_ptr = ex rest_size = a.size - sub_size val = self.symbols[a][sub_size:a.size] out = [(m2_expr.ExprMem(rest_ptr, rest_size), val)] else: #[a ] # XXXX[b ]YY #[a ] # XXXX[b ] out = [] # part X if ptr_diff > 0: val = self.symbols[a][0:ptr_diff * 8] out.append((m2_expr.ExprMem(a.arg, ptr_diff * 8), val)) # part Y if ptr_diff * 8 + b.size < a.size: ex = m2_expr.ExprOp('+', b.arg, m2_expr.ExprInt_from(b.arg, b.size / 8)) ex = self.expr_simp(self.eval_expr(ex, {})) rest_ptr = ex rest_size = a.size - (ptr_diff * 8 + b.size) val = self.symbols[a][ptr_diff * 8 + b.size:a.size] out.append((m2_expr.ExprMem(ex, val.size), val)) return out
def substract_mems(self, a, b): ex = b.arg - a.arg ex = self.expr_simp(self.eval_expr(ex, {})) if not isinstance(ex, m2_expr.ExprInt): return None ptr_diff = int(int32(ex.arg)) out = [] if ptr_diff < 0: # [a ] #[b ]XXX sub_size = b.size + ptr_diff * 8 if sub_size >= a.size: pass else: ex = m2_expr.ExprOp('+', a.arg, m2_expr.ExprInt_from(a.arg, sub_size / 8)) ex = self.expr_simp(self.eval_expr(ex, {})) rest_ptr = ex rest_size = a.size - sub_size val = self.symbols[a][sub_size:a.size] out = [(m2_expr.ExprMem(rest_ptr, rest_size), val)] else: #[a ] # XXXX[b ]YY #[a ] # XXXX[b ] out = [] # part X if ptr_diff > 0: val = self.symbols[a][0:ptr_diff * 8] out.append((m2_expr.ExprMem(a.arg, ptr_diff * 8), val)) # part Y if ptr_diff * 8 + b.size < a.size: ex = m2_expr.ExprOp('+', b.arg, m2_expr.ExprInt_from(b.arg, b.size / 8)) ex = self.expr_simp(self.eval_expr(ex, {})) rest_ptr = ex rest_size = a.size - (ptr_diff * 8 + b.size) val = self.symbols[a][ptr_diff * 8 + b.size:a.size] out.append((m2_expr.ExprMem(ex, val.size), val)) return out
def substract_mems(self, arg1, arg2): """ Return the remaining memory areas of @arg1 - @arg2 @arg1, @arg2: ExprMem """ ptr_diff = self.expr_simp(arg2.arg - arg1.arg) ptr_diff = int(int32(ptr_diff.arg)) zone1 = interval([(0, arg1.size/8-1)]) zone2 = interval([(ptr_diff, ptr_diff + arg2.size/8-1)]) zones = zone1 - zone2 out = [] for start, stop in zones: ptr = arg1.arg + m2_expr.ExprInt(start, arg1.arg.size) ptr = self.expr_simp(ptr) value = self.expr_simp(self.symbols[arg1][start*8:(stop+1)*8]) mem = m2_expr.ExprMem(ptr, (stop - start + 1)*8) assert mem.size == value.size out.append((mem, value)) return out