def test_memarg(self): ctx = {'path': []} ast = o_add( o_add( o_sub( o_add( o_sub(Const(0xbfb00000, 8), Mem(Arg(0, width=8), Const(0x00000008, 8)), 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8) flattened = [ Const(0xbfb00000, 8), Arg(0, width=8), Const(0x00000008, 8), Mem(Arg(0, width=8), Const(0x00000008, 8)), o_sub(Const(0xbfb00000, 8), Mem(Arg(0, width=8), Const(0x00000008, 8)), 8), Const(0x000ff000, 8), Const(0x00000008, 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), o_add( o_sub(Const(0xbfb00000, 8), Mem(Arg(0, width=8), Const(0x00000008, 8)), 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), o_sub( o_add( o_sub(Const(0xbfb00000, 8), Mem(Arg(0, width=8), Const(0x00000008, 8)), 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), o_add( o_sub( o_add( o_sub(Const(0xbfb00000, 8), Mem(Arg(0, width=8), Const(0x00000008, 8)), 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), o_add( o_add( o_sub( o_add( o_sub(Const(0xbfb00000, 8), Mem(Arg(0, width=8), Const(0x00000008, 8)), 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8) ] ast.walkTree(walkTree_cb, ctx) self.assertEqual(ctx['path'][-1], ast) self.assertEqual(ctx['path'], flattened) answer = o_add( o_sub(Const(0x00000000, 8), Mem(Arg(0, width=8), Const(0x00000008, 8)), 8), Const(0xbfbff010, 8), 8) self.assertEqual(answer, ast.reduce())
def test_flatten_constant(self): ctx = {'path': []} ast = o_add( o_add(o_add(Const(0x00000000, 8), Const(0x00000001, 8), 8), o_add(Const(0x00000002, 8), Const(0x00000003, 8), 8), 8), Const(0x00000004, 8), 8) flattened = [ Const(0x00000000, 8), Const(0x00000001, 8), o_add(Const(0x00000000, 8), Const(0x00000001, 8), 8), Const(0x00000002, 8), Const(0x00000003, 8), o_add(Const(0x00000002, 8), Const(0x00000003, 8), 8), o_add(o_add(Const(0x00000000, 8), Const(0x00000001, 8), 8), o_add(Const(0x00000002, 8), Const(0x00000003, 8), 8), 8), Const(0x00000004, 8), o_add( o_add(o_add(Const(0x00000000, 8), Const(0x00000001, 8), 8), o_add(Const(0x00000002, 8), Const(0x00000003, 8), 8), 8), Const(0x00000004, 8), 8), ] ast.walkTree(walkTree_cb, ctx) self.assertEqual(ctx['path'][-1], ast) self.assertEqual(ctx['path'], flattened) self.assertEqual(Const(0xa, 8), ast.reduce()) ctx = {'path': []} ast = o_add( o_add( o_sub( o_add(o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8) flattened = [ Const(0xbfb00000, 8), Const(0x00000008, 8), o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8), Const(0x000ff000, 8), Const(0x00000008, 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), o_add(o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), o_sub( o_add(o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), o_add( o_sub( o_add(o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), o_add( o_add( o_sub( o_add( o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8), o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8) ] ast.walkTree(walkTree_cb, ctx) self.assertEqual(ctx['path'], flattened) self.assertEqual(Const(0xbfbff008, 8), ast.reduce())
def test_moarmem(self): ctx = {'path': []} ast = o_sub( o_add( o_xor( o_and( o_sub( Mem( o_add(Arg(0, width=8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), o_and( o_sub( Mem( o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), 8), Const(0x00000001, 8), 8) ast.walkTree(walkTree_cb, ctx) flattened = [ Arg(0, width=8), Const(0x00000030, 8), o_add(Arg(0, width=8), Const(0x00000030, 8), 8), Const(0x00000008, 8), Mem(o_add(Arg(0, width=8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), Const(0x20000000, 8), Const(0x00000008, 8), Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8), Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), o_add( Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), o_sub( Mem(o_add(Arg(0, width=8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), o_and( o_sub( Mem(o_add(Arg(0, width=8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), Const(0x20000000, 8), Const(0x00000030, 8), o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8), Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), Const(0x20000000, 8), Const(0x00000008, 8), Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8), Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), o_add( Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), o_sub( Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), o_and( o_sub( Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), o_xor( o_and( o_sub( Mem(o_add(Arg(0, width=8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), o_and( o_sub( Mem( o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), o_add( o_xor( o_and( o_sub( Mem( o_add(Arg(0, width=8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), o_and( o_sub( Mem( o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), 8), Const(0x00000001, 8), o_sub( o_add( o_xor( o_and( o_sub( Mem( o_add(Arg(0, width=8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), o_and( o_sub( Mem( o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), 8), Const(0x00000001, 8), 8) ] self.assertEqual(ast, evalSymbolik(repr(ast))) self.assertEqual(ctx['path'], flattened) self.assertEqual(ctx['path'][-1], ast)
def test_nested(self): ctx = {'path': []} ast = o_add( o_add( o_add( o_add( o_sub( o_sub( o_add( o_add( o_add( o_add( o_add( o_add( o_sub( o_sub( o_sub( o_sub( o_sub( o_sub( o_sub( Const( 0xbfb00000, 8 ), Const( 0x00000008, 8 ), 8 ), Const( 0x00000008, 8 ), 8 ), Const( 0x00000008, 8 ), 8), Const( 0x00000008, 8), 8), Const( 0x00000008, 8), 8), Const( 0x00000008, 8), 8), Const( 0x00000068, 8), 8), Const(0x00000068, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), o_add( o_add( o_add( o_sub( o_sub( o_sub( o_sub( o_sub( o_sub( o_sub( Const( 0xff010, 8 ), Const( 0x00000008, 8 ), 8 ), Const( 0x00000008, 8 ), 8 ), Const( 0x00000008, 8 ), 8), Const( 0x00000008, 8), 8), Const( 0x00000008, 8), 8), Const( 0x00000008, 8), 8), Const( 0x00000068, 8), 8), Const(0x00000068, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8) ast.walkTree(walkTree_cb, ctx) self.assertEqual(ast.reduce(), Const(0xbfbfeff0, 8)) self.assertEqual(ctx['path'][-1], ast) self.assertEqual(len(ctx['path']), 59)
def test_mem(self): ctx = {'path': []} ast = o_sub( o_add( o_xor( o_and( o_sub( Mem( o_add( #Arg(0,width=8) Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem( #Arg(0,width=8) Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), o_and( o_sub( Mem( o_add( #Arg(0,width=8) Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem( #Arg(0,width=8) Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), 8), Const(0x00000001, 8), 8) flattened = [ Const(0x20000000, 8), Const(0x00000030, 8), o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8), Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), Const(0x20000000, 8), Const(0x00000008, 8), Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8), Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), o_add( Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), o_sub( Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), o_and( o_sub( Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), Const(0x20000000, 8), Const(0x00000030, 8), o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8), Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), Const(0x20000000, 8), Const(0x00000008, 8), Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8), Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), o_add( Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), o_sub( Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), o_and( o_sub( Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), o_xor( o_and( o_sub( Mem( o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), o_and( o_sub( Mem( o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), o_add( o_xor( o_and( o_sub( Mem( o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), o_and( o_sub( Mem( o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), 8), Const(0x00000001, 8), o_sub( o_add( o_xor( o_and( o_sub( Mem( o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), o_and( o_sub( Mem( o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8), Const(0x00000008, 8)), o_add( Mem( o_add( Mem(Const(0x20000000, 8), Const(0x00000008, 8)), Const(0x00000048, 8), 8), Const(0x00000008, 8)), Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), 8), Const(0x00000001, 8), 8) ] ast.walkTree(walkTree_cb, ctx) self.assertEqual(ctx['path'], flattened) self.assertEqual(ctx['path'][-1], ast)