public static Statement isHead(Statement head) { if (head.getLastBasicType() != Statement.LASTBASICTYPE_GENERAL) { return null; } Set<Statement> setHandlers = DecHelper.getUniquePredExceptions(head); if (setHandlers.size() != 1) { return null; } for (StatEdge edge : head.getSuccessorEdges(StatEdge.TYPE_EXCEPTION)) { Statement exc = edge.getDestination(); if (edge.getExceptions() == null && exc.getLastBasicType() == LASTBASICTYPE_GENERAL && setHandlers.contains(exc)) { List<StatEdge> lstSuccs = exc.getSuccessorEdges(STATEDGE_DIRECT_ALL); if (lstSuccs.isEmpty() || lstSuccs.get(0).getType() != StatEdge.TYPE_REGULAR) { if (head.isMonitorEnter() || exc.isMonitorEnter()) { return null; } if (DecHelper.checkStatementExceptions(Arrays.asList(head, exc))) { return new CatchAllStatement(head, exc); } } } } return null; }
if (stat.type == Statement.TYPE_CATCHALL && ((CatchAllStatement)stat).isFinally()) { stack = new LinkedList<>(stackFinally); isFinallyMonitorExceptionPath = (catchall.getMonitor() != null) & entry.isFinallyExceptionPath; if (!catchall.containsStatementStrict(destination)) { stack.removeLast(); created = false; if (!catchall.containsStatementStrict(destination)) { saveEdge(sourcenode, catchall.getHandler(), StatEdge.TYPE_REGULAR, isFinallyExit ? finallyShortRangeSource : null, finallyLongRangeSource, finallyShortRangeEntry, finallyLongRangeEntry, isFinallyMonitorExceptionPath); stack.add(new StackEntry(catchall, Boolean.TRUE, edgetype, destination, catchall.getHandler(), finallyLongRangeEntry == null ? catchall.getHandler() : finallyLongRangeEntry, sourcenode, finallyLongRangeSource, false)); statEntry.succEdges = lstSuccEdges; lstStackStatements.addFirst(statEntry); lstStackStatements.addFirst(new StatementStackEntry(catchall.getHandler(), stack, null));
BasicBlock head = fin.getBasichead().getBlock(); BasicBlock handler = fin.getHandler().getBasichead().getBlock(); fin.setFinally(true); fin.setMonitor(var == null ? null : new VarExprent(var, VarType.VARTYPE_INT, varProcessor)); insertSemaphore(graph, getAllBasicBlocks(fin.getFirst()), head, handler, varindex, inf, bytecode_version);
if (fin.isFinally() && fin.getMonitor() != null) { currVars.add(fin.getMonitor());
private static void collectCatchVars(Statement stat, FlattenStatementsHelper flatthelper, Map<String, VarExprent> map) { List<VarExprent> lst = null; if (stat.type == Statement.TYPE_CATCHALL) { CatchAllStatement catchall = (CatchAllStatement)stat; if (!catchall.isFinally()) { lst = catchall.getVars(); } } else if (stat.type == Statement.TYPE_TRYCATCH) { lst = ((CatchStatement)stat).getVars(); } if (lst != null) { for (int i = 1; i < stat.getStats().size(); i++) { map.put(flatthelper.getMapDestinationNodes().get(stat.getStats().get(i).id)[0], lst.get(i - 1)); } } for (Statement st : stat.getStats()) { collectCatchVars(st, flatthelper, map); } }
if (ca.getFirst().isContainsMonitorExit() && ca.getHandler().isContainsMonitorExit()) { SynchronizedStatement sync = new SynchronizedStatement(current, ca.getFirst(), ca.getHandler()); sync.setAllParent(); for (StatEdge edge : new HashSet<>(ca.getLabelEdges())) { sync.addLabeledEdge(edge); current.addSuccessor(new StatEdge(StatEdge.TYPE_REGULAR, current, ca.getFirst())); ca.getParent().replaceStatement(ca, sync); found = true; break;
lstVars = ((CatchAllStatement)stat).getVars();
private boolean verifyFinallyEx(ControlFlowGraph graph, CatchAllStatement fstat, Record information) { Set<BasicBlock> tryBlocks = getAllBasicBlocks(fstat.getFirst()); Set<BasicBlock> catchBlocks = getAllBasicBlocks(fstat.getHandler()); BasicBlock first = fstat.getHandler().getBasichead().getBlock(); boolean skippedFirst = false; removeExceptionInstructionsEx(fstat.getHandler().getBasichead().getBlock(), 1, finallytype);
private Record getFinallyInformation(StructMethod mt, RootStatement root, CatchAllStatement fstat) { Map<BasicBlock, Boolean> mapLast = new HashMap<>(); BasicBlockStatement firstBlockStatement = fstat.getHandler().getBasichead(); BasicBlock firstBasicBlock = firstBlockStatement.getBlock(); Instruction instrFirst = firstBasicBlock.getInstruction(0); Statement handler = fstat.getHandler(); for (StatEdge edge : blockStatement.getSuccessorEdges(Statement.STATEDGE_DIRECT_ALL)) { if (edge.getType() != StatEdge.TYPE_REGULAR && handler.containsStatement(blockStatement) if (fstat.getHandler().type == Statement.TYPE_BASICBLOCK) {
if (ca.getFirst().isContainsMonitorExit() && ca.getHandler().isContainsMonitorExit()) { SynchronizedStatement sync = new SynchronizedStatement(current, ca.getFirst(), ca.getHandler()); sync.setAllParent(); for (StatEdge edge : new HashSet<>(ca.getLabelEdges())) { sync.addLabeledEdge(edge); current.addSuccessor(new StatEdge(StatEdge.TYPE_REGULAR, current, ca.getFirst())); ca.getParent().replaceStatement(ca, sync); found = true; break;
private static void collectCatchVars(Statement stat, FlattenStatementsHelper flatthelper, Map<String, VarExprent> map) { List<VarExprent> lst = null; if (stat.type == Statement.TYPE_CATCHALL) { CatchAllStatement catchall = (CatchAllStatement)stat; if (!catchall.isFinally()) { lst = catchall.getVars(); } } else if (stat.type == Statement.TYPE_TRYCATCH) { lst = ((CatchStatement)stat).getVars(); } if (lst != null) { for (int i = 1; i < stat.getStats().size(); i++) { map.put(flatthelper.getMapDestinationNodes().get(stat.getStats().get(i).id)[0], lst.get(i - 1)); } } for (Statement st : stat.getStats()) { collectCatchVars(st, flatthelper, map); } }
private void setCatchMaps(Statement stat, DirectGraph dgraph, FlattenStatementsHelper flatthelper) { SFormsFastMapDirect map; switch (stat.type) { case Statement.TYPE_CATCHALL: case Statement.TYPE_TRYCATCH: List<VarExprent> lstVars; if (stat.type == Statement.TYPE_CATCHALL) { lstVars = ((CatchAllStatement)stat).getVars(); } else { lstVars = ((CatchStatement)stat).getVars(); } for (int i = 1; i < stat.getStats().size(); i++) { int varindex = lstVars.get(i - 1).getIndex(); int version = getNextFreeVersion(varindex); // == 1 map = new SFormsFastMapDirect(); setCurrentVar(map, varindex, version); extraVarVersions.put(dgraph.nodes.getWithKey(flatthelper.getMapDestinationNodes().get(stat.getStats().get(i).id)[0]).id, map); } } for (Statement st : stat.getStats()) { setCatchMaps(st, dgraph, flatthelper); } }
private boolean verifyFinallyEx(ControlFlowGraph graph, CatchAllStatement fstat, Record information) { HashSet<BasicBlock> tryBlocks = getAllBasicBlocks(fstat.getFirst()); HashSet<BasicBlock> catchBlocks = getAllBasicBlocks(fstat.getHandler()); BasicBlock first = fstat.getHandler().getBasichead().getBlock(); boolean skippedFirst = false; removeExceptionInstructionsEx(fstat.getHandler().getBasichead().getBlock(), 1, finallytype);
if (fin.isFinally() && fin.getMonitor() != null) { currVars.add(fin.getMonitor());
private Record getFinallyInformation(StructMethod mt, RootStatement root, CatchAllStatement fstat) { Map<BasicBlock, Boolean> mapLast = new HashMap<>(); BasicBlockStatement firstBlockStatement = fstat.getHandler().getBasichead(); BasicBlock firstBasicBlock = firstBlockStatement.getBlock(); Instruction instrFirst = firstBasicBlock.getInstruction(0); Statement handler = fstat.getHandler(); for (StatEdge edge : blockStatement.getSuccessorEdges(Statement.STATEDGE_DIRECT_ALL)) { if (edge.getType() != StatEdge.TYPE_REGULAR && handler.containsStatement(blockStatement) if (fstat.getHandler().type == Statement.TYPE_BASICBLOCK) {
BasicBlock head = fin.getBasichead().getBlock(); BasicBlock handler = fin.getHandler().getBasichead().getBlock(); fin.setFinally(true); fin.setMonitor(var == null ? null : new VarExprent(var.intValue(), VarType.VARTYPE_INT, varProcessor)); insertSemaphore(graph, getAllBasicBlocks(fin.getFirst()), head, handler, varindex, inf, bytecode_version);
if (stat.type == Statement.TYPE_CATCHALL && ((CatchAllStatement)stat).isFinally()) { stack = new LinkedList<>(stackFinally); isFinallyMonitorExceptionPath = (catchall.getMonitor() != null) & entry.isFinallyExceptionPath; if (!catchall.containsStatementStrict(destination)) { stack.removeLast(); created = false; if (!catchall.containsStatementStrict(destination)) { saveEdge(sourcenode, catchall.getHandler(), StatEdge.TYPE_REGULAR, isFinallyExit ? finallyShortRangeSource : null, finallyLongRangeSource, finallyShortRangeEntry, finallyLongRangeEntry, isFinallyMonitorExceptionPath); stack.add(new StackEntry(catchall, Boolean.TRUE, edgetype, destination, catchall.getHandler(), finallyLongRangeEntry == null ? catchall.getHandler() : finallyLongRangeEntry, sourcenode, finallyLongRangeSource, false)); statEntry.succEdges = lstSuccEdges; lstStackStatements.addFirst(statEntry); lstStackStatements.addFirst(new StatementStackEntry(catchall.getHandler(), stack, null));
lstVars = ((CatchAllStatement)st).getVars();
@Override public Statement getSimpleCopy() { CatchAllStatement cas = new CatchAllStatement(); cas.isFinally = this.isFinally; if (this.monitor != null) { cas.monitor = new VarExprent(DecompilerContext.getCounterContainer().getCounterAndIncrement(CounterContainer.VAR_COUNTER), VarType.VARTYPE_INT, DecompilerContext.getVarProcessor()); } if (!this.vars.isEmpty()) { cas.vars.add(new VarExprent(DecompilerContext.getCounterContainer().getCounterAndIncrement(CounterContainer.VAR_COUNTER), new VarType(CodeConstants.TYPE_OBJECT, 0, "java/lang/Throwable"), DecompilerContext.getVarProcessor())); } return cas; }
private void setCatchMaps(Statement stat, DirectGraph dgraph, FlattenStatementsHelper flatthelper) { SFormsFastMapDirect map; switch (stat.type) { case Statement.TYPE_CATCHALL: case Statement.TYPE_TRYCATCH: List<VarExprent> lstVars; if (stat.type == Statement.TYPE_CATCHALL) { lstVars = ((CatchAllStatement)stat).getVars(); } else { lstVars = ((CatchStatement)stat).getVars(); } for (int i = 1; i < stat.getStats().size(); i++) { int varindex = lstVars.get(i - 1).getIndex(); int version = getNextFreeVersion(varindex, stat); // == 1 map = new SFormsFastMapDirect(); setCurrentVar(map, varindex, version); extraVarVersions.put(dgraph.nodes.getWithKey(flatthelper.getMapDestinationNodes().get(stat.getStats().get(i).id)[0]).id, map); //ssuversions.createOrGetNode(new VarVersionPair(varindex, version)); ssuversions.createNode(new VarVersionPair(varindex, version)); } } for (Statement st : stat.getStats()) { setCatchMaps(st, dgraph, flatthelper); } }