def get_ast_loop(paths, last_loop, last_else, endif): ast = Ast_Loop() curr_loop_idx = paths.get_loops_idx() first_blk = gph.nodes[get_loop_start(curr_loop_idx)] if is_cond_jump(first_blk[0]): ast.add(get_ast_ifgoto(paths, curr_loop_idx, first_blk[0])) else: ast.add(first_blk) loop_paths, endloop = paths.extract_loop_paths(curr_loop_idx) # Checking if endloop == [] to determine if it's an # infinite loop is not sufficient # tests/nestedloop2 ast.set_infinite(paths_is_infinite(loop_paths)) paths.pop() ast.add(get_ast_branch(loop_paths, curr_loop_idx, last_else)) if not endloop: return ast, -1 epilog = Ast_Branch() if len(endloop) > 1: i = 1 for el in endloop[:-1]: epilog.add(Ast_Comment("endloop " + str(i))) epilog.add(get_ast_branch(el, last_loop, last_else)) i += 1 epilog.add(Ast_Comment("endloop " + str(i))) ast.set_epilog(epilog) return ast, endloop[-1].first()
def get_ast_loop(ctx, paths, last_loop_idx, last_else, endif): ast = Ast_Loop() curr_loop_idx = paths.get_loops_idx() first_blk = ctx.gph.nodes[paths.get_loop_start(curr_loop_idx)] # if the first instruction of the loop is a jump, it means # it's a loop condition. if first_blk[0].address in ctx.gph.cond_jumps_set: ast.add(get_ast_ifgoto(ctx, paths, curr_loop_idx, first_blk[0])) else: ast.add(first_blk) loop_paths, loopends, loopends_start = \ paths.extract_loop_paths(curr_loop_idx, last_loop_idx, endif) # Checking if loopend == [] to determine if it's an # infinite loop is not sufficient # tests/nestedloop2 ast.set_infinite(paths_is_infinite(loop_paths)) addr = loop_paths.pop(1)[0] ctx.seen.add(addr) ast.add(get_ast_branch(ctx, loop_paths, curr_loop_idx, last_else)) if not loopends: return ast, -1 epilog = Ast_Branch() if len(loopends) > 1: epilog_num = 1 for i, el in enumerate(loopends[:-1]): if isinstance(el, Ast_Goto): epilog.add(el) continue if el.first() in loopends_start: epilog.add(Ast_Comment("loopend " + str(epilog_num))) epilog_num += 1 epilog.add(get_ast_branch(ctx, el, last_loop_idx, last_else)) if loopends[-1].first() in loopends_start: epilog.add(Ast_Comment("loopend " + str(epilog_num))) ast.set_epilog(epilog) return ast, loopends[-1].first()
def get_ast_loop(ctx, paths, last_loop_idx, last_else): ast = Ast_Loop() curr_loop_idx = paths.get_loops_idx() first_blk = ctx.gph.nodes[paths.get_loop_start(curr_loop_idx)] # if the first instruction of the loop is a jump, it means # it's a loop condition. if first_blk[0].address in ctx.gph.cond_jumps_set: ast.add(get_ast_ifgoto(ctx, paths, curr_loop_idx, first_blk[0])) else: ast.add(first_blk) loop_paths, loopends, loopends_start = \ paths.extract_loop_paths(curr_loop_idx, last_loop_idx) # Checking if loopend == [] to determine if it's an # infinite loop is not sufficient # tests/nestedloop2 ast.set_infinite(paths_is_infinite(loop_paths)) addr = loop_paths.pop(1)[0] ctx.seen.add(addr) ast.add(get_ast_branch(ctx, loop_paths, curr_loop_idx)) if not loopends: return ast, -1 epilog = Ast_Branch() if len(loopends) > 1: epilog_num = 1 for i, el in enumerate(loopends[:-1]): if isinstance(el, Ast_Goto): epilog.add(el) continue if el.first() in loopends_start: epilog.add(Ast_Comment("loopend " + str(epilog_num))) epilog_num += 1 epilog.add(get_ast_branch(ctx, el, last_loop_idx)) if loopends[-1].first() in loopends_start: epilog.add(Ast_Comment("loopend " + str(epilog_num))) ast.set_epilog(epilog) return ast, loopends[-1].first()
def get_ast_loop(ctx, paths, last_loop_idx, last_else, endif): ast = Ast_Loop() curr_loop_idx = paths.get_loops_idx() first_blk = ctx.gph.nodes[paths.get_loop_start(curr_loop_idx)] if first_blk[0].address in ctx.gph.cond_jumps_set: ast.add(get_ast_ifgoto(ctx, paths, curr_loop_idx, first_blk[0])) else: ast.add(first_blk) loop_paths, endloops, endloops_start = \ paths.extract_loop_paths(curr_loop_idx, last_loop_idx, endif) # Checking if endloop == [] to determine if it's an # infinite loop is not sufficient # tests/nestedloop2 ast.set_infinite(paths_is_infinite(loop_paths)) addr = loop_paths.pop(1)[0] ctx.seen.add(addr) ast.add(get_ast_branch(ctx, loop_paths, curr_loop_idx, last_else)) if not endloops: return ast, -1 epilog = Ast_Branch() if len(endloops) > 1: i = 1 for el in endloops[:-1]: if el.first() in endloops_start: epilog.add(Ast_Comment("endloop " + str(i))) i += 1 epilog.add(get_ast_branch(ctx, el, last_loop_idx, last_else)) epilog.add(Ast_Comment("endloop " + str(i))) ast.set_epilog(epilog) return ast, endloops[-1].first()