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 class TempExpr extends AbstractJimpleValueSwitch
00053 {
00054
00055
00056
00057
00058 private SootMethod sm;
00059
00060
00061
00062
00063
00064 private Analysis analyser;
00065
00066
00067
00068
00069
00070 TempExpr()
00071 {
00072 analyser = Analysis.init();
00073 }
00074
00075
00076
00077
00078
00079 void build(Value v)
00080 {
00081 v.apply(this);
00082 }
00083
00084
00085
00086
00087
00088 public void caseArrayRef(ArrayRef v)
00089 {
00090 print(v, "ARRAYREFERENCE");
00091 }
00092
00093
00094
00095
00096
00097 public void caseInstanceFieldRef(InstanceFieldRef v)
00098 {
00099 print(v, "INSTANCEFIELDREFERENCE");
00100 }
00101
00102
00103
00104
00105
00106
00107 public void caseInterfaceInvokeExpr(InterfaceInvokeExpr v)
00108 {
00109 print(v, "INTERFACEMETHODINVOCATION");
00110 }
00111
00112
00113
00114
00115
00116 public void caseLocal(Local v)
00117 {
00118 print(v, "LOCALREFERENCE");
00119 }
00120
00121
00122
00123
00124
00125 public void caseParameterRef(ParameterRef v)
00126 {
00127 print(v, "PARAMETERREFERENCE");
00128 }
00129
00130
00131
00132
00133
00134 public void caseSpecialInvokeExpr(SpecialInvokeExpr v)
00135 {
00136 print(v, "SPECIALMETHODINVOCATION");
00137 }
00138
00139
00140
00141
00142
00143 public void caseStaticFieldRef(StaticFieldRef v)
00144 {
00145 print(v, "STATICFIELDREFERENCE");
00146 }
00147
00148
00149
00150
00151
00152 public void caseThisRef(ThisRef v)
00153 {
00154 print(v, "THISREFERENCE");
00155 }
00156
00157
00158
00159
00160
00161 public void caseVirtualInvokeExpr(VirtualInvokeExpr v)
00162 {
00163 print(v, "VIRTUALMETHODINVOCATION");
00164 }
00165
00166
00167
00168
00169
00170 public void defaultCase(Object obj)
00171 {
00172 System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
00173 "xxxxxxxxxxxxxxxxxxx");
00174 System.out.println("TEST: We donot handle " + obj + ".");
00175 System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
00176 "xxxxxxxxxxxxxxxxxxx");
00177 }
00178
00179
00180
00181
00182
00183 void init(SootMethod sm)
00184 {
00185 this.sm = sm;
00186 }
00187
00188
00189
00190
00191
00192
00193
00194
00195 void print(Value v, String s)
00196 {
00197 Collection values = null;
00198 boolean b = true;
00199 Analysis.StmtMethodPair smp = null;
00200
00201 if (!(v instanceof InvokeExpr)) {
00202 b = analyser.nullReference(v, sm);
00203 values = analyser.referenceValueSet(v, sm);
00204 }
00205 if (v instanceof NonStaticInvokeExpr) {
00206 values = analyser.invokeExprResolution((NonStaticInvokeExpr)v, sm);
00207 }
00208
00209 System.out.println("-------------------------------------" +
00210 "-----------------------");
00211 System.out.println(s + " expression:" + v);
00212 System.out.println("# VALUES :" + values.size());
00213
00214 for (Iterator t = values.iterator(); t.hasNext();) {
00215 Object i = t.next();
00216 if (i instanceof Analysis.ExprStmtMethodTriple) {
00217 Analysis.ExprStmtMethodTriple a =
00218 (Analysis.ExprStmtMethodTriple)i;
00219 System.out.println("{VALUE: " + a.getExpr() +
00220 ", STMT: " +
00221 a.getStmtMethodPair().getStmt() +
00222 ", Method: " +
00223 a.getStmtMethodPair().getSootMethod() +
00224
00225 "}");
00226 } else {
00227 System.out.println("{VALUE: " + i + ", TYPE: " + i.getClass() +
00228 "}");
00229 }
00230 }
00231 if (b) {
00232 System.out.println("NULLNESS: Maybe.");
00233 }
00234 else {
00235 System.out.println("NULLNESS: Never.");
00236 }
00237
00238 if (v instanceof Local || v instanceof Ref) {
00239 System.out.println("DEFINE sites:");
00240 for (Iterator i = analyser.getDefs(v, sm).iterator();
00241 i.hasNext();) {
00242 smp = (Analysis.StmtMethodPair)i.next();
00243 System.out.println(smp.getSootMethod()+ "{" + smp.getStmt() + "}");
00244 }
00245 System.out.println("USE sites:");
00246 for (Iterator i = analyser.getUses(v, sm).iterator();
00247 i.hasNext();) {
00248 smp = (Analysis.StmtMethodPair)i.next();
00249 System.out.println(smp.getSootMethod() + "{" + smp.getStmt() +
00250 "}");
00251 }
00252 }
00253 }
00254 }