Java 类soot.jimple.JimpleBody 实例源码
项目:JAADAS
文件:AbstractASMBackend.java
/**
* Gets the baf body for the given SootMethod. This method will first check
* whether the method already has a baf body. If not, it will query the local
* cache. If this fails as well, it will construct a new baf body.
* @param method The method for which to obtain a baf body
* @return The baf body for the given method
*/
protected BafBody getBafBody(SootMethod method) {
final Body activeBody = method.getActiveBody();
if (activeBody instanceof BafBody)
return (BafBody) activeBody;
BafBody body = bafBodyCache.get(method);
if (body != null)
return body;
if (activeBody instanceof JimpleBody) {
body = PackManager.v().convertJimpleBodyToBaf(method);
} else {
throw new RuntimeException(
"ASM-backend can only translate Baf- and JimpleBodies!");
}
bafBodyCache.put(method, body);
return body;
}
项目:JAADAS
文件:TypeResolver.java
private TypeResolver(JimpleBody stmtBody, Scene scene)
{
this.stmtBody = stmtBody;
hierarchy = ClassHierarchy.classHierarchy(scene);
OBJECT = hierarchy.OBJECT;
NULL = hierarchy.NULL;
typeVariable(OBJECT);
typeVariable(NULL);
// hack for J2ME library, reported by Stephen Cheng
if (!Options.v().j2me()) {
typeVariable(hierarchy.CLONEABLE);
typeVariable(hierarchy.SERIALIZABLE);
}
}
项目:JAADAS
文件:TypeAssigner.java
private boolean typingFailed(JimpleBody b) {
// Check to see if any locals are untyped
{
Iterator<Local> localIt = b.getLocals().iterator();
while (localIt.hasNext()) {
Local l = localIt.next();
if (l.getType().equals(UnknownType.v())
|| l.getType().equals(ErroneousType.v())) {
return true;
}
}
}
return false;
}
项目:JAADAS
文件:TypeResolverBV.java
private TypeResolverBV(JimpleBody stmtBody, Scene scene)
{
this.stmtBody = stmtBody;
hierarchy = ClassHierarchy.classHierarchy(scene);
OBJECT = hierarchy.OBJECT;
NULL = hierarchy.NULL;
typeVariable(OBJECT);
typeVariable(NULL);
// hack for J2ME library, reported by Stephen Cheng
if (!Options.v().j2me()) {
typeVariable(hierarchy.CLONEABLE);
typeVariable(hierarchy.SERIALIZABLE);
}
}
项目:averroes
文件:CodeGenerator.java
/**
* Create the default constructor for the Averroes library class.
*/
private void createAverroesAbstractLibraryInit() {
SootMethod init = Hierarchy.getNewDefaultConstructor();
JimpleBody body = Jimple.v().newBody(init);
init.setActiveBody(body);
averroesAbstractLibraryClass.addMethod(init);
// Call superclass constructor
body.insertIdentityStmts();
body.getUnits().add(
Jimple.v().newInvokeStmt(
Jimple.v().newSpecialInvokeExpr(body.getThisLocal(),
Hierarchy.getDefaultConstructor(Hierarchy.v().getJavaLangObject()).makeRef(),
Collections.<Value> emptyList())));
// Add return statement
body.getUnits().addLast(Jimple.v().newReturnVoidStmt());
// Finally validate the Jimple body
body.validate();
}
项目:averroes
文件:CodeGenerator.java
/**
* Create the static initializer for the Averroes library class.
*/
private void createAverroesLibraryInit() {
SootMethod init = Hierarchy.getNewDefaultConstructor();
JimpleBody body = Jimple.v().newBody(init);
init.setActiveBody(body);
averroesLibraryClass.addMethod(init);
// Call superclass constructor
body.insertIdentityStmts();
body.getUnits().add(
Jimple.v().newInvokeStmt(
Jimple.v().newSpecialInvokeExpr(body.getThisLocal(),
Hierarchy.getDefaultConstructor(averroesAbstractLibraryClass).makeRef(),
Collections.<Value> emptyList())));
// Add return statement
body.getUnits().addLast(Jimple.v().newReturnVoidStmt());
// Finally validate the Jimple body
body.validate();
}
项目:petablox
文件:StubMethodSupport.java
private static SootMethod genericMethod(SootMethod m, boolean removeSync) {
SootClass c = m.getDeclaringClass();
SootMethod s = new SootMethod(m.getName(), m.getParameterTypes(), m.getReturnType(), m.getModifiers() & ~Modifier.NATIVE);
if (removeSync) s.setModifiers(s.getModifiers() & ~Modifier.SYNCHRONIZED);
c.removeMethod(m);
c.addMethod(s);
if (s.isConcrete()) {
JimpleBody body = Jimple.v().newBody(s);
Chain<Unit> units = body.getUnits();
Chain<Local> locals = body.getLocals();
boolean isStatic = (s.getModifiers() & Modifier.STATIC) != 0;
if (!isStatic) {
Local thisLcl = Jimple.v().newLocal("this", c.getType());
locals.add(thisLcl);
units.add(Jimple.v().newIdentityStmt(thisLcl, Jimple.v().newThisRef(c.getType())));
}
int paramCnt = s.getParameterCount();
List<Type> paramTypeList = s.getParameterTypes();
for (int i = 0; i < paramCnt; i++) {
Local lcl = Jimple.v().newLocal("l" + i, paramTypeList.get(i));
locals.add(lcl);
units.add(Jimple.v().newIdentityStmt(lcl, Jimple.v().newParameterRef(paramTypeList.get(i), i)));
}
s.setActiveBody(body);
}
return s;
}
项目:petablox
文件:StubMethodSupport.java
/**
* Stub for instance method "void start()" in class java.lang.Thread.
*/
private static SootMethod getThreadStartEquiv(SootMethod m) {
SootMethod s = genericMethod(m, true);
JimpleBody body =(JimpleBody) s.retrieveActiveBody();
SootClass c = s.getDeclaringClass();
String runSig = "void run()";
SootMethod runM = c.getMethod(runSig);
Chain<Unit> units = body.getUnits();
Local thisLcl = body.getThisLocal();
units.add(Jimple.v().newInvokeStmt(Jimple.v().newVirtualInvokeExpr(thisLcl, runM.makeRef())));
units.add(Jimple.v().newReturnVoidStmt());
methodToStub.put(m, s);
methodToStub.put(s, s);
if (Config.verbose >= 2)
System.out.println("Custom stub (getThreadStartEquiv) for method: " + s.getName() + ":" + s.getDeclaringClass());
return s;
}
项目:petablox
文件:StubMethodSupport.java
/**
* Stub for instance method "java.lang.Object clone()" in class java.lang.Object.
*/
private static SootMethod getCloneEquiv(SootMethod m) {
SootMethod s = genericMethod(m, false);
JimpleBody body =(JimpleBody) s.retrieveActiveBody();
SootClass c = s.getDeclaringClass();
Chain<Unit> units = body.getUnits();
Chain<Local> locals = body.getLocals();
Local lcl1 = Jimple.v().newLocal("l", c.getType());
locals.add(lcl1);
Local thisLocal = body.getThisLocal();
units.add(Jimple.v().newAssignStmt(lcl1,thisLocal));
units.add(Jimple.v().newReturnStmt(lcl1));
methodToStub.put(m, s);
methodToStub.put(s, s);
if (Config.verbose >= 2)
System.out.println("Custom stub (getCloneEquiv) for method: " + s.getName() + ":" + s.getDeclaringClass());
return s;
}
项目:petablox
文件:StubMethodSupport.java
private static SootMethod getDoPrivileged(SootMethod m){
SootMethod s = genericMethod(m,false);
JimpleBody body =(JimpleBody) s.retrieveActiveBody();
List<Type> paramTypes = m.getParameterTypes();
RefType param1 = (RefType)paramTypes.get(0);
SootClass c = param1.getSootClass();
String runSig = "java.lang.Object run()";
SootMethod runM = c.getMethod(runSig);
Chain<Unit> units = body.getUnits();
Chain<Local> locals = body.getLocals();
Local invokeBase = locals.getFirst();
Local t0 = Jimple.v().newLocal("t0", RefType.v("java.lang.Object"));
locals.add(t0);
units.add(Jimple.v().newAssignStmt(t0, Jimple.v().newInterfaceInvokeExpr(invokeBase, runM.makeRef())));
units.add(Jimple.v().newReturnStmt(t0));
methodToStub.put(m, s);
methodToStub.put(s, s);
if (Config.verbose >= 2)
System.out.println("Custom stub (getDoPrivileged1) for method: " + s.getName() + ":" + s.getDeclaringClass());
return s;
}
项目:petablox
文件:StubMethodSupport.java
/**
* Empty stub for unsupported native methods / excluded methods
*/
private static SootMethod emptyStub(SootMethod m) {
SootMethod s = genericMethod(m, false);
if (s.isConcrete()) {
JimpleBody body =(JimpleBody) s.retrieveActiveBody();
SootClass c = s.getDeclaringClass();
Chain<Unit> units = body.getUnits();
if (s.getReturnType() instanceof VoidType)
units.add(Jimple.v().newReturnVoidStmt());
else {
Chain<Local> locals = body.getLocals();
Local lcl = Jimple.v().newLocal("retlcl", s.getReturnType());
locals.add(lcl);
units.add(Jimple.v().newReturnStmt(lcl));
}
}
methodToStub.put(m, s);
methodToStub.put(s, s);
if (Config.verbose >= 2)
System.out.println("Empty stub for method: " + s.getName() + ":" + s.getDeclaringClass());
return s;
}
项目:soot-inflow
文件:BaseEntryPointCreator.java
/**
* Constructs an array of the given type with a single element of this type
* in the given method
* @param body The body of the method in which to create the array
* @param gen The local generator
* @param tp The type of which to create the array
* @param constructionStack Set of classes currently being built to avoid
* constructor loops
* @param parentClasses If a requested type is compatible with one of the
* types in this list, the already-created object is used instead of
* creating a new one.
* @return The local referencing the newly created array, or null if the
* array generation failed
*/
private Value buildArrayOfType(JimpleBody body, LocalGenerator gen, ArrayType tp,
Set<SootClass> constructionStack, Set<SootClass> parentClasses) {
Local local = gen.generateLocal(tp);
// Generate a new single-element array
NewArrayExpr newArrayExpr = Jimple.v().newNewArrayExpr(tp.getElementType(),
IntConstant.v(1));
AssignStmt assignArray = Jimple.v().newAssignStmt(local, newArrayExpr);
body.getUnits().add(assignArray);
// Generate a single element in the array
AssignStmt assign = Jimple.v().newAssignStmt
(Jimple.v().newArrayRef(local, IntConstant.v(19)),
getValueForType(body, gen, tp.getElementType(), constructionStack, parentClasses));
body.getUnits().add(assign);
return local;
}
项目:matos-tool
文件:AndroidWrapper.java
/**
* Create default constructor of the wrapper class.
* @return
*/
private SootMethod createInit() {
SootMethod method = new SootMethod("<init>", new ArrayList<Type>(), VoidType.v(), Modifier.PUBLIC);
JimpleBody body = Jimple.v().newBody(method);
method.setActiveBody(body);
Chain <Local> locals = body.getLocals();
PatchingChain<Unit> units = body.getUnits();
RefType thisType = RefType.v(WRAPPER_PATH);
Local r0 = jimple.newLocal("r0", thisType);
locals.add(r0);
units.add(jimple.newIdentityStmt(r0, jimple.newThisRef(thisType)));
SootMethod initObject = scene.getMethod("<java.lang.Object: void <init>()>");
units.add(jimple.newInvokeStmt
(jimple.newSpecialInvokeExpr(r0, initObject.makeRef())));
units.add(jimple.newReturnVoidStmt());
return method;
}
项目:JAADAS
文件:PointsToAnalysis.java
private static Map/*<Integer,Local>*/ getLocals(SootClass sc, String methodname, String typename) {
Map res = new HashMap();
Iterator mi = sc.getMethods().iterator();
while (mi.hasNext()) {
SootMethod sm = (SootMethod)mi.next();
System.err.println(sm.getName());
if (true && sm.getName().equals(methodname) && sm.isConcrete()) {
JimpleBody jb = (JimpleBody)sm.retrieveActiveBody();
Iterator ui = jb.getUnits().iterator();
while (ui.hasNext()) {
Stmt s = (Stmt)ui.next();
int line = getLineNumber(s);
// find definitions
Iterator bi = s.getDefBoxes().iterator();
while (bi.hasNext()) {
Object o = bi.next();
if (o instanceof ValueBox) {
Value v = ((ValueBox)o).getValue();
if (v.getType().toString().equals(typename) && v instanceof Local)
res.put(new Integer(line),v);
}
}
}
}
}
return res;
}
项目:JAADAS
文件:JimpleAST.java
private void stashBodiesForClass(SootClass sc)
{
methodToParsedBodyMap = new HashMap<SootMethod, JimpleBody>();
Walker w = new BodyExtractorWalker(sc, SootResolver.v(), methodToParsedBodyMap);
boolean oldPhantomValue = Scene.v().getPhantomRefs();
Scene.v().setPhantomRefs(true);
mTree.apply(w);
Scene.v().setPhantomRefs(oldPhantomValue);
}
项目:JAADAS
文件:TypeResolver.java
public TypeResolver(JimpleBody jb)
{
this.jb = jb;
this.assignments = new ArrayList<DefinitionStmt>();
this.depends = new HashMap<Local, BitSet>();
for ( Local v : this.jb.getLocals() )
this.addLocal(v);
this.initAssignments();
}
项目:JAADAS
文件:TypeResolver.java
public CastInsertionUseVisitor(boolean countOnly, JimpleBody jb,
Typing tg, IHierarchy h)
{
this.jb = jb;
this.tg = tg;
this.h = h;
this.countOnly = countOnly;
this.count = 0;
}
项目:JAADAS
文件:TypeResolver.java
public TypePromotionUseVisitor(JimpleBody jb, Typing tg)
{
this.jb = jb;
this.tg = tg;
this.fail = false;
this.typingChanged = false;
}
项目:JAADAS
文件:ConstraintChecker.java
public void check(Stmt stmt, JimpleBody stmtBody) throws TypeException {
try {
this.stmtBody = stmtBody;
stmt.apply(this);
} catch (RuntimeTypeException e) {
StringWriter st = new StringWriter();
PrintWriter pw = new PrintWriter(st);
e.printStackTrace(pw);
pw.close();
throw new TypeException(st.toString());
}
}
项目:JAADAS
文件:TypeAssigner.java
private static int compareTypings(JimpleBody a, JimpleBody b) {
int r = 0;
Iterator<Local> ib = b.getLocals().iterator();
for (Local v : a.getLocals()) {
Type ta = v.getType(), tb = ib.next().getType();
if (soot.jimple.toolkits.typing.fast.TypeResolver
.typesEqual(ta, tb))
continue;
/*
* Sometimes there is no reason to choose between the char and byte /
* short types. Enabling this check allows one algorithm to select
* char and the other to select byte / short without returning
* incomparable.
*/
else if (true && ((ta instanceof CharType && (tb instanceof ByteType || tb instanceof ShortType))
|| (tb instanceof CharType && (ta instanceof ByteType || ta instanceof ShortType))))
continue;
else if (soot.jimple.toolkits.typing.fast.AugHierarchy.ancestor_(
ta, tb)) {
if (r == -1)
return 3;
else
r = 1;
} else if (soot.jimple.toolkits.typing.fast.AugHierarchy.ancestor_(
tb, ta)) {
if (r == 1)
return 3;
else
r = -1;
} else
return 3;
}
return r;
}
项目:JAADAS
文件:NopEliminator.java
/** Removes {@link NopStmt}s from the passed body (which must be
a {@link JimpleBody}). Complexity is linear
with respect to the statements.
*/
protected void internalTransform(Body b, String phaseName, Map<String, String> options)
{
JimpleBody body = (JimpleBody)b;
if(Options.v().verbose())
G.v().out.println("[" + body.getMethod().getName() +
"] Removing nops...");
Chain<Unit> units = body.getUnits();
// Just do one trivial pass.
{
Iterator<Unit> stmtIt = units.snapshotIterator();
while(stmtIt.hasNext())
{
Unit u = stmtIt.next();
if (u instanceof NopStmt) {
// Hack: do not remove nop, if is is used for a Trap which
// is at the very end of the code.
boolean keepNop = false;
if (b.getUnits().getLast() == u) {
for (Trap t : b.getTraps()) {
if (t.getEndUnit() == u) {
keepNop = true;
}
}
}
if (!keepNop) {
units.remove(u);
}
}
}
}
}
项目:JAADAS
文件:PackManager.java
public BafBody convertJimpleBodyToBaf(SootMethod m) {
JimpleBody body = (JimpleBody) m.getActiveBody().clone();
//Change
// ConditionalBranchFolder.v().transform(body);
// UnreachableCodeEliminator.v().transform(body);
// DeadAssignmentEliminator.v().transform(body);
// UnusedLocalEliminator.v().transform(body);
BafBody bafBody = Baf.v().newBody(body);
PackManager.v().getPack("bop").apply(bafBody);
PackManager.v().getPack("tag").apply(bafBody);
if( Options.v().validate() ) {
bafBody.validate();
}
return bafBody;
}
项目:JAADAS
文件:CFGViewer.java
protected void internalTransform(Body b, String phaseName, Map<String, String> options) {
initialize(options);
SootMethod meth = b.getMethod();
if ((methodsToPrint == null) || (meth.getDeclaringClass().getName() == methodsToPrint.get(meth.getName()))) {
Body body = ir.getBody((JimpleBody) b);
print_cfg(body);
}
}
项目:HybridFlow
文件:VirtualWebview.java
private SootMethod createMockSink(String name) {
name = String.format("mockSink%d_%s", mockMethodId++, name);
List<Type> paras = new ArrayList<>();
paras.add(objectClass.getType());
SootMethod m = new SootMethod(name, paras, VoidType.v(),
Modifier.PUBLIC | Modifier.STATIC);
webViewBridgeClass.addMethod(m);
JimpleBody mockSinkBody = Jimple.v().newBody(m);
mockSinkBody.getUnits().addLast(Jimple.v().newReturnVoidStmt());
m.setActiveBody(mockSinkBody);
this.setJavaMethodArgsAsSink(m);
return m;
}
项目:HybridFlow
文件:VirtualWebview.java
private SootMethod createMockSource(String name) {
name = String.format("mockSource%d_%s", mockMethodId++, name);
List<Type> paras = new ArrayList<>();
SootMethod m = new SootMethod(name, paras, objectClass.getType(),
Modifier.PUBLIC | Modifier.STATIC);
webViewBridgeClass.addMethod(m);
JimpleBody mockSourceBody = Jimple.v().newBody(m);
mockSourceBody.getUnits().addLast(
Jimple.v().newReturnStmt(
Jimple.v().newLocal("taint", objectClass.getType())));
m.setActiveBody(mockSourceBody);
this.setJavaMethodRetAsSource(m);
return m;
}
项目:averroes
文件:CodeGenerator.java
/**
* Create the Jimple body for the given library method. If it's a
* constructor, then we need to initialize all the fields in the class with
* objects compatible from the LPT. If it's the static initializer, then we
* need to initialize all the static fields of the class with objects
* compatible from the LPT. method.
*
* @param method
*
* @return
*/
private JimpleBody createJimpleBody(SootMethod method) {
if (method.getDeclaringClass().getName().equals(Names.AVERROES_ABSTRACT_LIBRARY_CLASS)
|| method.getDeclaringClass().getName().equals(Names.AVERROES_LIBRARY_CLASS)) {
throw new IllegalArgumentException("Creating Jimple body for " + method.getSignature()
+ ". We should never enter createJimpleBody() for the Averroes library classes.");
}
// Create a basic Jimple body
AverroesJimpleBody body = new AverroesJimpleBody(method);
// Insert the appropriate method body
if (body.isConstructor()) {
body.initializeInstanceFields();
} else if (body.isStaticInitializer()) {
body.initializeStaticFields();
} else {
// the standard library method will have nothing more in its body
}
// Insert the standard Jimple body footer
body.insertStandardJimpleBodyFooter();
// Validate the Jimple body
body.validate();
// TODO
// System.out.println(body.getJimpleBody());
return (JimpleBody) method.getActiveBody();
}
项目:petablox
文件:StubMethodSupport.java
/**
* Stub for static method "void set(Object array, int index, Object value)
* in class java.lang.reflect.Array.
* Stub code is as follows:
* t0 = (Object[])param0
* t0[0] = param2
* return
*/
private static SootMethod getArraySetEquiv(SootMethod m) {
SootMethod s = genericMethod(m, false);
JimpleBody body =(JimpleBody) s.retrieveActiveBody();
SootClass c = s.getDeclaringClass();
Chain<Unit> units = body.getUnits();
Chain<Local> locals = body.getLocals();
//t0 = (Object[])param0
Local l0 = body.getParameterLocal(0);
CastExpr ce0 = Jimple.v().newCastExpr(l0, ArrayType.v(RefType.v("java.lang.Object"), 1));
Local t0 = Jimple.v().newLocal("t0", c.getType());
locals.add(t0);
units.add(Jimple.v().newAssignStmt(t0, ce0));
//t0[0] = param2
Local l2 = body.getParameterLocal(2);
ArrayRef ar2 = Jimple.v().newArrayRef((Value)t0, (Value)IntConstant.v(0));
units.add(Jimple.v().newAssignStmt(ar2, l2));
//return
units.add(Jimple.v().newReturnVoidStmt());
methodToStub.put(m, s);
methodToStub.put(s, s);
if (Config.verbose >= 2)
System.out.println("Custom stub (getArraySetEquiv) for method: " + s.getName() + ":" + s.getDeclaringClass());
return s;
}
项目:soot-infoflow-android-iccta
文件:ICCDummyMainCreator.java
public SootMethod generateDummyMainMethod(List<String> entryPoints, String sootClassName)
{
List<String> androidClasses = new ArrayList<String>();
androidClasses.add(sootClassName);
SootMethod mainMethod = new SootMethod(DUMMY_MAIN_METHOD,
new ArrayList<Type>(),
VoidType.v(),
Modifier.PUBLIC);// | Modifier.STATIC); //no need be static
JimpleBody body = Jimple.v().newBody(mainMethod);
mainMethod.setActiveBody(body);
SootClass compSootClass = Scene.v().getSootClass(sootClassName);
compSootClass.addMethod(mainMethod);
//this is mandatory, the default dummyMainMethod is static, so they
//do not deal thisIdentity. since we don't need static dummyMainMethod,
//we should define it explicit
body.insertIdentityStmts();
Map<String, List<String>> callbackFunctions = new HashMap<String, List<String>>();
callbackFunctions.put(sootClassName, getCallbackFunctions(compSootClass));
AndroidEntryPointCreator androidEPCreator = new AndroidEntryPointCreator(androidClasses);
androidEPCreator.setCallbackFunctions(callbackFunctions);
return androidEPCreator.createDummyMain(mainMethod);
}
项目:soot-infoflow-android-iccta
文件:ICCRedirectionCreator.java
public SootMethod generateRedirectMethodForStartActivity(SootClass wrapper) {
System.out.println("create method to call wrapper class: "+ wrapper);
String newSM_name = "redirector" + num++;
List<Type> newSM_parameters = new ArrayList<Type>();
newSM_parameters.add(INTENT_TYPE);
Type newSM_return_type = VoidType.v();
int modifiers = Modifier.STATIC | Modifier.PUBLIC;
SootMethod newSM = new SootMethod(newSM_name, newSM_parameters, newSM_return_type, modifiers);
ipcSC.addMethod(newSM);
JimpleBody b = Jimple.v().newBody(newSM);
newSM.setActiveBody(b);
LocalGenerator lg = new LocalGenerator(b);
// identity
Local intentParameterLocal = lg.generateLocal(INTENT_TYPE);
Unit intentParameterU = Jimple.v().newIdentityStmt(
intentParameterLocal,
Jimple.v().newParameterRef(INTENT_TYPE, 0));
// new
Local al = lg.generateLocal(wrapper.getType());
Unit newU = (Unit) Jimple.v().newAssignStmt(al,
Jimple.v().newNewExpr(wrapper.getType())
);
// init
List<Type> parameters = new ArrayList<Type>();
parameters.add(INTENT_TYPE);
SootMethod method = wrapper.getMethod("<init>", parameters, VoidType.v());
List<Value> args = new ArrayList<Value>();
args.add(intentParameterLocal);
Unit initU = (Unit) Jimple.v().newInvokeStmt(
Jimple.v().newSpecialInvokeExpr(al, method.makeRef(), args));
// call dummyMainMethod
//method = wrapper.getMethodByName(ICCDummyMainCreator.DUMMY_MAIN_METHOD);
method = wrapper.getMethodByName("onCreate");
args = new ArrayList<Value>();
Local pLocal = lg.generateLocal(RefType.v("android.os.Bundle"));
Unit nullParamU = (Unit) Jimple.v().newAssignStmt(pLocal, NullConstant.v());
args.add(pLocal);
InvokeExpr invoke = Jimple.v().newVirtualInvokeExpr(al, method.makeRef(), args);
Unit callU = (Unit) Jimple.v().newInvokeStmt(invoke);
b.getUnits().add(intentParameterU);
b.getUnits().add(newU);
b.getUnits().add(initU);
b.getUnits().add(nullParamU);
b.getUnits().add(callU);
b.getUnits().add(Jimple.v().newReturnVoidStmt());
System.out.println("new lifecypcle method: "+ newSM +" body: "+ newSM.retrieveActiveBody());
return newSM;
}
项目:soot-inflow
文件:BaseEntryPointCreator.java
protected SootMethod createEmptyMainMethod(JimpleBody body){
SootMethod mainMethod = new SootMethod("dummyMainMethod", new ArrayList<Type>(), VoidType.v());
body.setMethod(mainMethod);
mainMethod.setActiveBody(body);
SootClass mainClass = new SootClass("dummyMainClass");
mainClass.addMethod(mainMethod);
// First add class to scene, then make it an application class
// as addClass contains a call to "setLibraryClass"
Scene.v().addClass(mainClass);
mainClass.setApplicationClass();
mainMethod.setModifiers(Modifier.PUBLIC | Modifier.STATIC);
return mainMethod;
}
项目:matos-tool
文件:LocalAnalysis.java
/**
* Constructed for a given method.
* @param jb the Jimple body of the method
*/
public LocalAnalysis(JimpleBody jb) {
CompleteUnitGraph ug = new CompleteUnitGraph(jb);
unitGraph = ug;
defs = new SimpleLocalDefs(ug);
uses = new SimpleLocalUses(ug,defs);
}
项目:jgs
文件:ALevelDefinitionChecker.java
private SootMethod generatedTestMethod(SootClass sootClass) {
List<RefType> parameterTypes = new ArrayList<RefType>();
for (int i = 0; i < 2; i++) {
parameterTypes.add(RefType.v("int"));
}
SootMethod sootMethod =
new SootMethod("compare", parameterTypes, RefType.v("int"));
sootMethod.setDeclaringClass(sootClass);
sootClass.addMethod(sootMethod);
JimpleBody body = Jimple.v().newBody(sootMethod);
sootMethod.setActiveBody(body);
Chain<Unit> units = body.getUnits();
units.add(Jimple.v().newReturnStmt(IntConstant.v(42)));
return sootMethod;
}
项目:jgs
文件:AnalysisUtils.java
/**
* Method creates a static initializer with an empty body for the specified
* class and returns this method.
*
* @param sootClass
* Class for which the empty static initializer should be
* created.
* @return Static initializer method with an empty method body for the
* specified class.
*/
public static SootMethod generatedEmptyStaticInitializer(SootClass sootClass) {
SootMethod sootMethod =
new SootMethod(staticInitializerName,
new ArrayList<Object>(),
VoidType.v(),
STATIC);
sootMethod.setDeclaringClass(sootClass);
sootClass.addMethod(sootMethod);
JimpleBody body = Jimple.v().newBody(sootMethod);
sootMethod.setActiveBody(body);
Chain<Unit> units = body.getUnits();
units.add(Jimple.v().newReturnVoidStmt());
return sootMethod;
}
项目:JAADAS
文件:SootMethodRefImpl.java
/**
* Creates a method body that throws an "unresolved compilation error"
* message
* @param declaringClass The class that was supposed to contain the method
* @return The created SootMethod
*/
private SootMethod createUnresolvedErrorMethod(SootClass declaringClass) {
SootMethod m = new SootMethod(name, parameterTypes, returnType, isStatic()?Modifier.STATIC:0);
int modifiers = Modifier.PUBLIC; // we don't know who will be calling us
if (isStatic())
modifiers |= Modifier.STATIC;
m.setModifiers(modifiers);
JimpleBody body = Jimple.v().newBody(m);
m.setActiveBody(body);
final LocalGenerator lg = new LocalGenerator(body);
// For producing valid Jimple code, we need to access all parameters.
// Otherwise, methods like "getThisLocal()" will fail.
if (!isStatic) {
RefType thisType = RefType.v(declaringClass);
Local lThis = lg.generateLocal(thisType);
body.getUnits().add(Jimple.v().newIdentityStmt(lThis, Jimple.v().newThisRef(thisType)));
}
for (int i = 0; i < m.getParameterCount(); i++) {
Type paramType = m.getParameterType(i);
Local lParam = lg.generateLocal(paramType);
body.getUnits().add(Jimple.v().newIdentityStmt(lParam, Jimple.v().newParameterRef(paramType, i)));
}
//exc = new Error
RefType runtimeExceptionType = RefType.v("java.lang.Error");
NewExpr newExpr = Jimple.v().newNewExpr(runtimeExceptionType);
Local exceptionLocal = lg.generateLocal(runtimeExceptionType);
AssignStmt assignStmt = Jimple.v().newAssignStmt(exceptionLocal, newExpr);
body.getUnits().add(assignStmt);
//exc.<init>(message)
SootMethodRef cref = Scene.v().makeConstructorRef(runtimeExceptionType.getSootClass(),
Collections.<Type>singletonList(RefType.v("java.lang.String")));
SpecialInvokeExpr constructorInvokeExpr = Jimple.v().newSpecialInvokeExpr(exceptionLocal, cref,
StringConstant.v("Unresolved compilation error: Method "+getSignature()+" does not exist!"));
InvokeStmt initStmt = Jimple.v().newInvokeStmt(constructorInvokeExpr);
body.getUnits().insertAfter(initStmt, assignStmt);
//throw exc
body.getUnits().insertAfter(Jimple.v().newThrowStmt(exceptionLocal), initStmt);
declaringClass.addMethod(m);
return m;
}
项目:JAADAS
文件:ReflectiveCallsInliner.java
private void addCaching(Kind kind) {
SootClass c;
String methodName;
switch(kind) {
case ClassNewInstance:
c = Scene.v().getSootClass("java.lang.Class");
methodName = "knownClassNewInstance";
break;
case ConstructorNewInstance:
c = Scene.v().getSootClass("java.lang.reflect.Constructor");
methodName = "knownConstructorNewInstance";
break;
case MethodInvoke:
c = Scene.v().getSootClass("java.lang.reflect.Method");
methodName = "knownMethodInvoke";
break;
case ClassForName:
//Cannot implement caching in this case because we can add no field to the String argument
return;
default:
throw new IllegalStateException("unknown kind: "+kind);
}
SootClass reflCallsClass = Scene.v().getSootClass("soot.rtlib.tamiflex.ReflectiveCalls");
SootMethod m = reflCallsClass.getMethodByName(methodName);
JimpleBody body = (JimpleBody) m.retrieveActiveBody();
LocalGenerator localGen = new LocalGenerator(body);
Unit firstStmt = body.getFirstNonIdentityStmt();
firstStmt = body.getUnits().getPredOf(firstStmt);
Stmt jumpTarget = Jimple.v().newNopStmt();
Chain<Unit> newUnits = new HashChain<Unit>();
//alreadyCheckedLocal = m.alreadyChecked
InstanceFieldRef fieldRef = Jimple.v().newInstanceFieldRef(body.getParameterLocal(m.getParameterCount()-1), Scene.v().makeFieldRef(c, ALREADY_CHECKED_FIELDNAME, BooleanType.v(), false));
Local alreadyCheckedLocal = localGen.generateLocal(BooleanType.v());
newUnits.add(Jimple.v().newAssignStmt(alreadyCheckedLocal, fieldRef));
//if(!alreadyChecked) goto jumpTarget
newUnits.add(Jimple.v().newIfStmt(Jimple.v().newEqExpr(alreadyCheckedLocal, IntConstant.v(0)), jumpTarget));
//return
newUnits.add(Jimple.v().newReturnVoidStmt());
//jumpTarget: nop
newUnits.add(jumpTarget);
//m.alreadyChecked = true
InstanceFieldRef fieldRef2 = Jimple.v().newInstanceFieldRef(body.getParameterLocal(m.getParameterCount()-1), Scene.v().makeFieldRef(c, ALREADY_CHECKED_FIELDNAME, BooleanType.v(), false));
newUnits.add(Jimple.v().newAssignStmt(fieldRef2, IntConstant.v(1)));
body.getUnits().insertAfter(newUnits, firstStmt);
if(Options.v().validate()) body.validate();
}
项目:JAADAS
文件:UseChecker.java
public UseChecker(JimpleBody jb)
{
this.jb = jb;
}
项目:JAADAS
文件:ConstraintCollector.java
public void collect(Stmt stmt, JimpleBody stmtBody) {
this.stmtBody = stmtBody;
stmt.apply(this);
}
项目:JAADAS
文件:ConstraintCollector.java
public void collect(Stmt stmt, JimpleBody stmtBody) {
this.stmtBody = stmtBody;
stmt.apply(this);
}
项目:JAADAS
文件:TypeAssigner.java
/** Assign types to local variables. * */
protected void internalTransform(Body b, String phaseName, Map<String, String> options) {
if (b == null) {
throw new NullPointerException();
}
Date start = new Date();
if (Options.v().verbose())
G.v().out.println("[TypeAssigner] typing system started on "
+ start);
JBTROptions opt = new JBTROptions(options);
ignoreWrongStaticNess = opt.ignore_wrong_staticness();
/*
* Setting this guard to true enables comparison of the original and new
* type assigners. This will be slow since type assignment will always
* happen twice. The actual types used for Jimple are determined by the
* use-old-type-assigner option.
*
* Each comparison is written as a separate semicolon-delimited line to
* the standard output, and the first field is always 'cmp' for use in
* grep. The format is:
*
* cmp;Method Name;Stmt Count;Old Inference Time (ms); New Inference
* Time (ms);Typing Comparison
*
* The Typing Comparison field compares the old and new typings: -2 -
* Old typing contains fewer variables (BAD!) -1 - Old typing is tighter
* (BAD!) 0 - Typings are equal 1 - New typing is tighter 2 - New typing
* contains fewer variables 3 - Typings are incomparable (inspect
* manually)
*
* In a final release this guard, and anything in the first branch,
* would probably be removed.
*/
if (opt.compare_type_assigners()) {
compareTypeAssigners(b,opt.use_older_type_assigner());
} else {
if (opt.use_older_type_assigner())
TypeResolver.resolve((JimpleBody) b, Scene.v());
else
(new soot.jimple.toolkits.typing.fast.TypeResolver(
(JimpleBody) b)).inferTypes();
}
Date finish = new Date();
if (Options.v().verbose()) {
long runtime = finish.getTime() - start.getTime();
long mins = runtime / 60000;
long secs = (runtime % 60000) / 1000;
G.v().out.println("[TypeAssigner] typing system ended. It took "
+ mins + " mins and " + secs + " secs.");
}
replaceNullType(b);
if (typingFailed((JimpleBody) b))
throw new RuntimeException("type inference failed!");
}
项目:JAADAS
文件:CFGIntermediateRep.java
public Body getBody(JimpleBody b) {
return b;
}