00001 package edu.ksu.cis.bandera.bofa;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 import ca.mcgill.sable.soot.*;
00038 import ca.mcgill.sable.soot.jimple.*;
00039 import ca.mcgill.sable.util.*;
00040 import edu.ksu.cis.bandera.jjjc.CompilationManager;
00041 import java.io.PrintWriter;
00042 import org.apache.log4j.Category;
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 class Demo {
00059
00060
00061
00062
00063
00064 private static Category cat;
00065
00066 static {
00067 cat = Category.getInstance("edu.ksu.cis.bandera.bofa.Demo");
00068 }
00069
00070
00071
00072
00073
00074
00075
00076 static void analyze(Collection storedClasses)
00077 {
00078 SootClass sc;
00079 SootMethod sm;
00080 TempExpr expr = new TempExpr();
00081 TempStmt stmt = new TempStmt(expr);
00082
00083 if (storedClasses == null || storedClasses.size() == 0) {
00084 System.out.println("You need to compile before you do " +
00085 "Flow Analysis");
00086 return;
00087 }
00088
00089 for (Iterator e = storedClasses.iterator(); e.hasNext();) {
00090 Object o = e.next();
00091 if (o instanceof java.lang.String) {
00092 cat.warn("SootClass not available. -- " + o.getClass());
00093 continue;
00094 }
00095 sc = (SootClass) o;
00096 System.out.println("###########################################" +
00097 "##########################");
00098 System.out.println("PROCESSING CLASS " + sc);
00099 for (Iterator methods =
00100 sc.getMethods().iterator();methods.hasNext();) {
00101 sm = (SootMethod)methods.next();
00102 StmtList stmts;
00103 System.out.println("=======================================" +
00104 "=======================================");
00105 System.out.println("PROCESSING METHOD " + sc + "." + sm);
00106 try {
00107 stmts = ((JimpleBody)sm.getBody(Jimple.v())).getStmtList();
00108 } catch (RuntimeException ee) {
00109 cat.warn(ee.getMessage());
00110 continue;
00111 }
00112
00113 if (!FA.isReachable(sm)){
00114 cat.warn("Unreachable method: " + sm);
00115 continue;
00116 }
00117 expr.init(sm);
00118 stmt.init(sm, stmts);
00119 for (Iterator i = stmts.iterator(); i.hasNext();) {
00120 Stmt s = (Stmt)i.next();
00121 System.out.println("*********************************" +
00122 "*********************************");
00123 System.out.println("PROCESSING STMT " + s);
00124 stmt.build(s);
00125 }
00126 }
00127 }
00128 }
00129
00130
00131
00132
00133
00134 static void jjjc (String[] args) {
00135 LinkedList classes = new LinkedList();
00136 for (int i = 1; i < args.length; i++) {
00137 classes.addLast(args[i].trim());
00138 }
00139 BOFA.compile(".", classes, new LinkedList());
00140 BOFA.analyze();
00141 BOFA.dumpFile(".");
00142 analyze(Util.convert("ca.mcgill.sable.util.VectorList",
00143 CompilationManager.getCompiledClasses().values()));
00144 }
00145
00146
00147
00148
00149
00150
00151
00152
00153 public static void main (String[] args) {
00154 if (args[0].equals("jjjc")) {
00155 jjjc(args);
00156 } else if (args[0].equals("soot")){
00157 soot(args);
00158 } else {
00159 System.out.println("Usage: java edu.ksu.cis.bandera.bofa.Demo" +
00160 "[jjjc|soot] classlist");
00161 System.exit(0);
00162 }
00163 }
00164
00165
00166
00167
00168
00169 static void soot(String[] args) {
00170 SootClassManager scm = new SootClassManager();
00171 LinkedList storedclasses = new LinkedList();
00172 java.io.PrintWriter p = new java.io.PrintWriter(System.out, true);
00173 BuildAndStoreBody basb =
00174 new BuildAndStoreBody(Jimple.v(),
00175 new StoredBody(ClassFile.v()));
00176 for (int i = 1; i < args.length; i++) {
00177 SootClass sc = scm.getClass(args[i]);
00178 sc.resolve();
00179 sc.printTo(basb, p);
00180 storedclasses.add(sc);
00181 }
00182 BOFA.analyze(scm, storedclasses);
00183 analyze(storedclasses);
00184 }
00185 }