diff options
| -rw-r--r-- | example/expression/access_c.py | 8 | ||||
| -rw-r--r-- | example/ida/depgraph.py | 6 | ||||
| -rw-r--r-- | miasm2/analysis/data_analysis.py | 4 | ||||
| -rw-r--r-- | miasm2/analysis/data_flow.py | 10 | ||||
| -rw-r--r-- | miasm2/analysis/depgraph.py | 8 | ||||
| -rw-r--r-- | miasm2/ir/ir.py | 14 | ||||
| -rw-r--r-- | test/analysis/data_flow.py | 2 | ||||
| -rw-r--r-- | test/analysis/depgraph.py | 24 |
8 files changed, 42 insertions, 34 deletions
diff --git a/example/expression/access_c.py b/example/expression/access_c.py index 45f911ab..de158730 100644 --- a/example/expression/access_c.py +++ b/example/expression/access_c.py @@ -60,15 +60,15 @@ def find_call(ira): for irb in ira.blocks.values(): out = set() - if len(irb.assignblks) < 2: + if len(irb) < 2: continue - assignblk = irb.assignblks[-2] + assignblk = irb[-2] for src in assignblk.itervalues(): if not isinstance(src, ExprOp): continue if not src.op.startswith('call_func'): continue - out.add((irb, len(irb.assignblks) - 2)) + out.add((irb, len(irb) - 2)) if len(out) != 1: continue irb, index = out.pop() @@ -98,7 +98,7 @@ def get_funcs_arg0(ctx, ira, lbl_head): element = ira.arch.regs.RSI for irb, index in find_call(ira): - instr = irb.assignblks[index].instr + instr = irb[index].instr print 'Analysing references from:', hex(instr.offset), instr g_list = g_dep.get(irb.label, set([element]), index, set([lbl_head])) for dep in g_list: diff --git a/example/ida/depgraph.py b/example/ida/depgraph.py index a946706c..5342313a 100644 --- a/example/ida/depgraph.py +++ b/example/ida/depgraph.py @@ -110,13 +110,13 @@ Method to use: elif mode == 1: return value + 1 else: - return len(self.ira.blocks[self.label].assignblks) + return len(self.ira.blocks[self.label]) @property def elements(self): value = self.cbReg.value if value in self.stk_args: - line = self.ira.blocks[self.label].assignblks[self.line_nb].instr + line = self.ira.blocks[self.label][self.line_nb].instr arg_num = self.stk_args[value] stk_high = m2_expr.ExprInt(idc.GetSpd(line.offset), ir_arch.sp.size) stk_off = m2_expr.ExprInt(self.ira.sp.size/8 * arg_num, ir_arch.sp.size) @@ -174,7 +174,7 @@ def treat_element(): for node in graph.relevant_nodes: try: - offset = ir_arch.blocks[node.label].assignblks[node.line_nb].instr.offset + offset = ir_arch.blocks[node.label][node.line_nb].instr.offset except IndexError: print "Unable to highlight %s" % node continue diff --git a/miasm2/analysis/data_analysis.py b/miasm2/analysis/data_analysis.py index fd50c855..130d45a4 100644 --- a/miasm2/analysis/data_analysis.py +++ b/miasm2/analysis/data_analysis.py @@ -85,7 +85,7 @@ def intra_block_flow_symbexec(ir_arch, flow_graph, irb, in_nodes, out_nodes): continue read_values = v.get_r(cst_read=True) # print n_w, v, [str(x) for x in read_values] - node_n_w = get_node_name(irb.label, len(irb.assignblks), n_w) + node_n_w = get_node_name(irb.label, len(irb), n_w) for n_r in read_values: if n_r in current_nodes: @@ -171,7 +171,7 @@ def create_implicit_flow(ir_arch, flow_graph, irb_in_nodes, irb_out_ndes): # print "###", irb_son # print "###", 'IN', [str(x) for x in irb_son.in_nodes] - node_n_w = irb.label, len(irb.assignblks), n_r + node_n_w = irb.label, len(irb), n_r irb_out_nodes[irb.label][n_r] = node_n_w if not n_r in irb_in_nodes[irb.label]: irb_in_nodes[irb.label][n_r] = irb.label, 0, n_r diff --git a/miasm2/analysis/data_flow.py b/miasm2/analysis/data_flow.py index da79cf75..3a789cc3 100644 --- a/miasm2/analysis/data_flow.py +++ b/miasm2/analysis/data_flow.py @@ -59,7 +59,7 @@ class ReachingDefinitions(dict): predecessor_state = {} for pred_lbl in self.ir_a.graph.predecessors(block.label): pred = self.ir_a.blocks[pred_lbl] - for lval, definitions in self.get_definitions(pred_lbl, len(pred.assignblks)).iteritems(): + for lval, definitions in self.get_definitions(pred_lbl, len(pred)).iteritems(): predecessor_state.setdefault(lval, set()).update(definitions) modified = self.get((block.label, 0)) != predecessor_state @@ -67,7 +67,7 @@ class ReachingDefinitions(dict): return False self[(block.label, 0)] = predecessor_state - for index in xrange(len(block.assignblks)): + for index in xrange(len(block)): modified |= self.process_instruction(block, index) return modified @@ -79,7 +79,7 @@ class ReachingDefinitions(dict): (@block, @assignblk_index + 1). """ - instr = block.assignblks[assignblk_index] + instr = block[assignblk_index] defs = self.get_definitions(block.label, assignblk_index).copy() for lval in instr: defs.update({lval: set([(block.label, assignblk_index)])}) @@ -183,7 +183,7 @@ class DiGraphDefUse(DiGraph): attr={'align': 'center', 'colspan': 2, 'bgcolor': 'grey'}) - src = self._blocks[lbl].assignblks[index][reg] + src = self._blocks[lbl][index][reg] line = "%s = %s" % (reg, src) yield self.DotCellDescription(text=line, attr={}) yield self.DotCellDescription(text="", attr={}) @@ -215,7 +215,7 @@ def dead_simp_useful_instrs(defuse, reaching_defs): # Block has a nonexistant successor or is a leaf if keep_all_definitions or (len(successors) == 0): valid_definitions = reaching_defs.get_definitions(block_lbl, - len(block.assignblks)) + len(block)) for lval, definitions in valid_definitions.iteritems(): if (lval in ir_a.get_out_regs(block) or keep_all_definitions): diff --git a/miasm2/analysis/depgraph.py b/miasm2/analysis/depgraph.py index 50eea948..bd4bfa7e 100644 --- a/miasm2/analysis/depgraph.py +++ b/miasm2/analysis/depgraph.py @@ -265,9 +265,9 @@ class DependencyResult(DependencyState): break assignmnts = {} for element in elements: - if element in irb.assignblks[line_nb]: + if element in irb[line_nb]: # constants, label, ... are not in destination - assignmnts[element] = irb.assignblks[line_nb][element] + assignmnts[element] = irb[line_nb][element] assignblks.append(AssignBlock(assignmnts)) return IRBlock(irb.label, assignblks) @@ -581,9 +581,9 @@ class DependencyGraph(object): @state: instance of DependencyState""" irb = self._ira.blocks[state.label] - line_nb = len(irb.assignblks) if state.line_nb is None else state.line_nb + line_nb = len(irb) if state.line_nb is None else state.line_nb - for cur_line_nb, assignblk in reversed(list(enumerate(irb.assignblks[:line_nb]))): + for cur_line_nb, assignblk in reversed(list(enumerate(irb[:line_nb]))): self._track_exprs(state, assignblk, cur_line_nb) def get(self, label, elements, line_nb, heads): diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py index 8b1a1033..f31db76b 100644 --- a/miasm2/ir/ir.py +++ b/miasm2/ir/ir.py @@ -288,6 +288,14 @@ class IRBlock(object): """Iterate on assignblks""" return self._assignblks.__iter__() + def __getitem__(self, index): + """Getitem on assignblks""" + return self._assignblks.__getitem__(index) + + def __len__(self): + """Length of assignblks""" + return self._assignblks.__len__() + def is_dst_set(self): return self._dst is not None @@ -636,7 +644,7 @@ class IntermediateRepresentation(object): else: dst = m2_expr.ExprId(next_lbl, self.pc.size) - assignblk = AssignBlock({self.IRDst: dst}, irblock.assignblks[-1].instr) + assignblk = AssignBlock({self.IRDst: dst}, irblock[-1].instr) ir_blocks[index] = IRBlock(irblock.label, list(irblock.assignblks) + [assignblk]) def post_add_block(self, block, ir_blocks): @@ -790,9 +798,9 @@ class IntermediateRepresentation(object): # Find candidates jmp_blocks = set() for block in self.blocks.itervalues(): - if len(block.assignblks) != 1: + if len(block) != 1: continue - assignblk = block.assignblks[0] + assignblk = block[0] if len(assignblk) > 1: continue assert set(assignblk.keys()) == set([self.IRDst]) diff --git a/test/analysis/data_flow.py b/test/analysis/data_flow.py index 207e13ff..f2e30172 100644 --- a/test/analysis/data_flow.py +++ b/test/analysis/data_flow.py @@ -635,7 +635,7 @@ G17_EXP_IRB0 = gen_irblock(LBL0, [[], ExprAff(b, a), ExprAff(c, b)], - G17_IRB0.assignblks[14] + G17_IRB0[14] # Trick because a+b+c != ((a+b)+c) ]) diff --git a/test/analysis/depgraph.py b/test/analysis/depgraph.py index 20d558e2..290547fe 100644 --- a/test/analysis/depgraph.py +++ b/test/analysis/depgraph.py @@ -510,72 +510,72 @@ G17_IRA.blocks = dict([(irb.label, irb) for irb in [G17_IRB0, G17_IRB1, # Test graph 1 G1_TEST1_DN1 = DependencyNode( - G1_IRB2.label, A, len(G1_IRB2.assignblks)) + G1_IRB2.label, A, len(G1_IRB2)) G1_INPUT = (set([G1_TEST1_DN1]), set([G1_IRB0.label])) # Test graph 2 G2_TEST1_DN1 = DependencyNode( - G2_IRB2.label, A, len(G2_IRB2.assignblks)) + G2_IRB2.label, A, len(G2_IRB2)) G2_INPUT = (set([G2_TEST1_DN1]), set([G2_IRB0.label])) # Test graph 3 G3_TEST1_0_DN1 = DependencyNode( - G3_IRB3.label, A, len(G3_IRB3.assignblks)) + G3_IRB3.label, A, len(G3_IRB3)) G3_INPUT = (set([G3_TEST1_0_DN1]), set([G3_IRB0.label])) # Test graph 4 G4_TEST1_DN1 = DependencyNode( - G4_IRB2.label, A, len(G2_IRB0.assignblks)) + G4_IRB2.label, A, len(G2_IRB0)) G4_INPUT = (set([G4_TEST1_DN1]), set([G4_IRB0.label])) # Test graph 5 G5_TEST1_0_DN1 = DependencyNode( - G5_IRB2.label, A, len(G5_IRB2.assignblks)) + G5_IRB2.label, A, len(G5_IRB2)) G5_INPUT = (set([G5_TEST1_0_DN1]), set([G5_IRB0.label])) # Test graph 6 G6_TEST1_0_DN1 = DependencyNode( - G6_IRB1.label, A, len(G6_IRB1.assignblks)) + G6_IRB1.label, A, len(G6_IRB1)) G6_INPUT = (set([G6_TEST1_0_DN1]), set([G6_IRB0.label])) # Test graph 7 G7_TEST1_0_DN1 = DependencyNode( - G7_IRB2.label, D, len(G7_IRB2.assignblks)) + G7_IRB2.label, D, len(G7_IRB2)) G7_INPUT = (set([G7_TEST1_0_DN1]), set([G7_IRB0.label])) # Test graph 8 G8_TEST1_0_DN1 = DependencyNode( - G8_IRB2.label, A, len(G8_IRB2.assignblks)) + G8_IRB2.label, A, len(G8_IRB2)) G8_INPUT = (set([G8_TEST1_0_DN1]), set([G3_IRB0.label])) # Test 9: Multi elements G9_TEST1_0_DN1 = DependencyNode( - G8_IRB2.label, A, len(G8_IRB2.assignblks)) + G8_IRB2.label, A, len(G8_IRB2)) G9_TEST1_0_DN5 = DependencyNode( - G8_IRB2.label, C, len(G8_IRB2.assignblks)) + G8_IRB2.label, C, len(G8_IRB2)) G9_INPUT = (set([G9_TEST1_0_DN1, G9_TEST1_0_DN5]), set([G8_IRB0.label])) # Test 10: loop at beginning G10_TEST1_0_DN1 = DependencyNode( - G10_IRB2.label, A, len(G10_IRB2.assignblks)) + G10_IRB2.label, A, len(G10_IRB2)) G10_INPUT = (set([G10_TEST1_0_DN1]), set([G10_IRB1.label])) @@ -583,7 +583,7 @@ G10_INPUT = (set([G10_TEST1_0_DN1]), set([G10_IRB1.label])) # Test 11: no dual bloc emulation G11_TEST1_DN1 = DependencyNode( - G11_IRB2.label, A, len(G11_IRB2.assignblks)) + G11_IRB2.label, A, len(G11_IRB2)) G11_INPUT = (set([G11_TEST1_DN1]), set([G11_IRB0.label])) |