Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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