package soottocfg.cfg.util; import java.util.List; import soottocfg.cfg.expression.BinaryExpression; import soottocfg.cfg.expression.Expression; import soottocfg.cfg.expression.IdentifierExpression; import soottocfg.cfg.expression.IteExpression; import soottocfg.cfg.expression.TupleAccessExpression; import soottocfg.cfg.expression.UnaryExpression; import soottocfg.cfg.expression.literal.BooleanLiteral; import soottocfg.cfg.expression.literal.IntegerLiteral; import soottocfg.cfg.expression.literal.NullLiteral; import soottocfg.cfg.method.CfgBlock; import soottocfg.cfg.method.Method; import soottocfg.cfg.statement.AssertStatement; import soottocfg.cfg.statement.AssignStatement; import soottocfg.cfg.statement.AssumeStatement; import soottocfg.cfg.statement.CallStatement; import soottocfg.cfg.statement.NewStatement; import soottocfg.cfg.statement.PullStatement; import soottocfg.cfg.statement.PushStatement; import soottocfg.cfg.statement.Statement; //DSN should this be an abstract class //The scanner visits all nodes, but does not modify them. //Whereas the updater visits and rebuilds all nodes public class CfgScanner extends CfgVisitor { public CfgScanner() { } public boolean scanMethod(Method m) { processMethod(m); return true; } @Override protected void processCfgBlock(CfgBlock block) { // Update the node setCurrentCfgBlock(block); processStatementList(block.getStatements()); setCurrentCfgBlock(null); } @Override protected List<Statement> processStatementList(List<Statement> sl) { for (Statement s : sl) { processStatement(s); } return sl; } @Override protected Statement processStatement(AssertStatement s) { processExpression(s.getExpression()); return s; } @Override protected Statement processStatement(AssignStatement s) { processExpression(s.getLeft()); processExpression(s.getRight()); return s; } @Override protected Statement processStatement(AssumeStatement s) { processExpression(s.getExpression()); return s; } protected Statement processStatement(CallStatement s) { processExpressionList(s.getArguments()); for (Expression e : s.getReceiver()) { processExpression(e); } return s; } @Override protected Statement processStatement(NewStatement s) { processExpression(s.getLeft()); return s; } /// Expressions @Override protected List<Expression> processExpressionList(List<Expression> el) { for (Expression e : el) { processExpression(e); } return el; } @Override protected Statement processStatement(PullStatement s) { // for (IdentifierExpression l : s.getLeft()) { // processExpression(l); // } processExpression(s.getObject()); return s; } @Override protected Statement processStatement(PushStatement s) { for (Expression r : s.getRight()) { processExpression(r); } processExpression(s.getObject()); return s; } @Override protected Expression processExpression(BinaryExpression e) { processExpression(e.getLeft()); processExpression(e.getRight()); return e; } @Override protected Expression processExpression(BooleanLiteral e) { return e; } @Override protected Expression processExpression(IdentifierExpression e) { return e; } @Override protected Expression processExpression(IntegerLiteral e) { return e; } @Override protected Expression processExpression(NullLiteral e) { return e; } @Override protected Expression processExpression(TupleAccessExpression e) { return e; } @Override protected Expression processExpression(IteExpression ite) { processExpression(ite.getCondition()); processExpression(ite.getThenExpr()); processExpression(ite.getElseExpr()); return ite; } @Override protected Expression processExpression(UnaryExpression e) { processExpression(e.getExpression()); return e; } }