From ab5442f5301727edf77260947b2fca339ca9bd44 Mon Sep 17 00:00:00 2001 From: Fabrice Desclaux Date: Mon, 4 Feb 2019 15:29:22 +0100 Subject: Add simplifications --- test/expression/simplifications.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'test/expression') diff --git a/test/expression/simplifications.py b/test/expression/simplifications.py index 5bca3fa9..263479b7 100644 --- a/test/expression/simplifications.py +++ b/test/expression/simplifications.py @@ -101,6 +101,10 @@ i3 = ExprInt(3, 32) im1 = ExprInt(-1, 32) im2 = ExprInt(-2, 32) +bi0 = ExprInt(0, 1) +bi1 = ExprInt(1, 1) + + icustom = ExprInt(0x12345678, 32) cc = ExprCond(a, b, c) @@ -692,6 +696,33 @@ to_test = [ (a8.zeroExtend(32)[2:5], a8[2:5]), + + ( + ExprCond(a + b, a, b), + ExprCond(ExprOp(TOK_EQUAL, a, -b), b, a) + ), + + ( + ExprCond(a + i1, a, b), + ExprCond(ExprOp(TOK_EQUAL, a, im1), b, a) + ), + + + ( + ExprCond(ExprOp(TOK_EQUAL, a, i1), bi1, bi0), + ExprOp(TOK_EQUAL, a, i1) + ), + + ( + ExprCond(ExprOp(TOK_INF_SIGNED, a, i1), bi1, bi0), + ExprOp(TOK_INF_SIGNED, a, i1) + ), + + ( + ExprOp(TOK_INF_EQUAL_UNSIGNED, a, i0), + ExprOp(TOK_EQUAL, a, i0) + ), + ] for e_input, e_check in to_test: -- cgit 1.4.1 From 15976e2f8c0a490d6c6b8c3ef02d38762ed8585c Mon Sep 17 00:00:00 2001 From: Fabrice Desclaux Date: Fri, 8 Feb 2019 21:06:19 +0100 Subject: Add simp cst == X+ cst; X ^cst = cst --- miasm2/expression/simplifications_common.py | 59 ++++++++++++++++++----------- test/expression/simplifications.py | 15 ++++++++ 2 files changed, 52 insertions(+), 22 deletions(-) (limited to 'test/expression') diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py index 87720e08..a4b7c61e 100644 --- a/miasm2/expression/simplifications_common.py +++ b/miasm2/expression/simplifications_common.py @@ -909,6 +909,7 @@ def simp_cmp_int(expr_simp, expr): """ ({X, 0} == int) => X == int[:] X + int1 == int2 => X == int2-int1 + X ^ int1 == int2 => X == int1^int2 """ if (expr.is_op(TOK_EQUAL) and expr.args[1].is_int() and @@ -922,28 +923,42 @@ def simp_cmp_int(expr_simp, expr): expr = expr_simp( ExprOp(TOK_EQUAL, src, new_int) ) - elif (expr.is_op() and - expr.op in [ - TOK_EQUAL, - ] and - expr.args[1].is_int() and - expr.args[0].is_op("+") and - expr.args[0].args[-1].is_int()): - # X + int1 == int2 => X == int2-int1 - # WARNING: - # X - 0x10 <=u 0x20 gives X in [0x10 0x30] - # which is not equivalet to A <=u 0x10 - - left, right = expr.args - left, int_diff = left.args[:-1], left.args[-1] - if len(left) == 1: - left = left[0] - else: - left = ExprOp('+', *left) - new_int = expr_simp(right - int_diff) - expr = expr_simp( - ExprOp(expr.op, left, new_int), - ) + elif not expr.is_op(TOK_EQUAL): + return expr + assert len(expr.args) == 2 + + left, right = expr.args + if left.is_int() and not right.is_int(): + left, right = right, left + if not right.is_int(): + return expr + if not (left.is_op() and left.op in ['+', '^']): + return expr + if not left.args[-1].is_int(): + return expr + # X + int1 == int2 => X == int2-int1 + # WARNING: + # X - 0x10 <=u 0x20 gives X in [0x10 0x30] + # which is not equivalet to A <=u 0x10 + + left_orig = left + left, last_int = left.args[:-1], left.args[-1] + + if len(left) == 1: + left = left[0] + else: + left = ExprOp(left.op, *left) + + if left_orig.op == "+": + new_int = expr_simp(right - last_int) + elif left_orig.op == '^': + new_int = expr_simp(right ^ last_int) + else: + raise RuntimeError("Unsupported operator") + + expr = expr_simp( + ExprOp(TOK_EQUAL, left, new_int), + ) return expr diff --git a/test/expression/simplifications.py b/test/expression/simplifications.py index 263479b7..cc33fc54 100644 --- a/test/expression/simplifications.py +++ b/test/expression/simplifications.py @@ -494,6 +494,21 @@ to_test = [ ExprOp(TOK_EQUAL, a8, ExprInt(0xFF, 8)) ), + ( + ExprOp(TOK_EQUAL, i2, a + i1), + ExprOp(TOK_EQUAL, a , i1) + ), + + ( + ExprOp(TOK_EQUAL, a ^ i1, i2), + ExprOp(TOK_EQUAL, a , i3) + ), + + ( + ExprOp(TOK_EQUAL, i2, a ^ i1), + ExprOp(TOK_EQUAL, a , i3) + ), + (ExprOp(TOK_INF_SIGNED, i1, i2), ExprInt(1, 1)), (ExprOp(TOK_INF_UNSIGNED, i1, i2), ExprInt(1, 1)), (ExprOp(TOK_INF_EQUAL_SIGNED, i1, i2), ExprInt(1, 1)), -- cgit 1.4.1