diff options
| author | Camille Mougey <commial@gmail.com> | 2018-04-18 16:41:50 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-04-18 16:41:50 +0200 |
| commit | 46abbce25653c99f2d73270b4f3eb3ec50bd36b4 (patch) | |
| tree | 09d83dd109a3669b72335fb9b0e59d9b19c190b7 | |
| parent | 82f9e5defa36f336bd1dd2c060afe135c89f8474 (diff) | |
| parent | c1f5cfee785ce53f53173630c3196e7606d041b7 (diff) | |
| download | miasm-46abbce25653c99f2d73270b4f3eb3ec50bd36b4.tar.gz miasm-46abbce25653c99f2d73270b4f3eb3ec50bd36b4.zip | |
Merge pull request #716 from serpilliere/fix_asmblock_simplify
Fix asmblock simplify
| -rw-r--r-- | miasm2/ir/ir.py | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py index 64eb3463..982399da 100644 --- a/miasm2/ir/ir.py +++ b/miasm2/ir/ir.py @@ -240,15 +240,18 @@ class AssignBlock(object): return m2_expr.ExprAff(dst, self[dst]) def simplify(self, simplifier): - """Return a new AssignBlock with expression simplified - @simplifier: ExpressionSimplifier instance""" + """ + Return a new AssignBlock with expression simplified + + @simplifier: ExpressionSimplifier instance + """ new_assignblk = {} for dst, src in self.iteritems(): if dst == src: continue - src = simplifier(src) - dst = simplifier(dst) - new_assignblk[dst] = src + new_src = simplifier(src) + new_dst = simplifier(dst) + new_assignblk[new_dst] = new_src return AssignBlock(irs=new_assignblk, instr=self.instr) @@ -687,12 +690,16 @@ class IntermediateRepresentation(object): Simplify expressions in each irblocks @simplifier: ExpressionSimplifier instance """ + modified = False for label, block in self.blocks.iteritems(): assignblks = [] for assignblk in block: new_assignblk = assignblk.simplify(simplifier) + if assignblk != new_assignblk: + modified = True assignblks.append(new_assignblk) self.blocks[label] = IRBlock(label, assignblks) + return modified def replace_expr_in_ir(self, bloc, rep): for assignblk in bloc: @@ -808,6 +815,10 @@ class IntermediateRepresentation(object): continue if not expr_is_label(assignblk[self.IRDst]): continue + dst = assignblk[self.IRDst].name + if dst == block.label: + # Infinite loop block + continue jmp_blocks.add(block.label) # Remove them, relink graph @@ -844,7 +855,7 @@ class IntermediateRepresentation(object): self.graph.add_uniq_edge(lbl, dst_label) modified = True if dst.src1 == dst.src2: - dst = src1 + dst = dst.src1 else: continue new_parent = parent.set_dst(dst) |