/** * Checks whether the given statement is the end of an implicit flow. If this is the case, then * the corresponding if statement which is the start of this implicit flow will be removed from * the program counter in the outgoing locals map. Note, that the method will not change the * incoming locals map. * * @param statement Statement for which should be checked whether it is the end of an implicit * flow. * @param in Current incoming map of the local variables. * @param out Current outgoing map of the local variables. */ private void checkEndOfImplicitFlow(Stmt statement, LocalsMap in, LocalsMap out) { List<IfStmt> ifStmts = new ArrayList<IfStmt>(in.getProgramCounter().keySet()); for (IfStmt ifStmt : ifStmts) { if (getContainer().postDomSetOfStmtContainsS(ifStmt, statement)) { out.removeProgramCounterLevel(ifStmt); } } }
/** * Compute the merge of the <code>in1</code> and <code>in2</code> locals maps, putting the result * into <code>out</code>. The behavior of this function is that the strongest <em>security * level</em> which exists for a local variable in <code>in1</code> or <code>in2</code>, is taken * for the <code>out</code> locals map. Used by the {@link SecurityLevelAnalysis#doAnalysis()} * method. * * @param in1 First locals map that should be merged together with the second map. * @param in2 Second locals map that should be merged together with the first map. * @param out Outgoing locals map that should store the result of the merge of <code>in1</code> * and <code>in2</code>. * @see soot.toolkits.scalar.AbstractFlowAnalysis#merge(java.lang.Object, java.lang.Object, * java.lang.Object) */ @Override protected void merge(LocalsMap in1, LocalsMap in2, LocalsMap out) { copy(in1, out); out.addAllStronger(in2.getExtendedLocals()); }
/** * Creates a copy of the <code>source</code> flow object, i.e. the locals map, in <code>dest * </code>. * * @param source The locals map that should be copied in the given outgoing map. * @param dest The locals map in which the state of the first given locals map should be copied. * @see soot.toolkits.scalar.AbstractFlowAnalysis#copy(java.lang.Object, java.lang.Object) */ @Override protected void copy(LocalsMap source, LocalsMap dest) { dest.clear(); dest.addAll(source.getExtendedLocals(), source.getProgramCounter()); }