[Soot-list] Pointsto analysis for reflection methods

Eric Bodden eric.bodden at uni-paderborn.de
Wed Dec 18 06:46:29 EST 2019


Hi.

Are you actually re-executing the pointer analysis after your call to reset()?

Eric

> On 11. Dec 2019, at 10:22, Jun GAO <jun.gao at uni.lu> wrote:
> 
> Hi David,
> 
> Thanks for your quick reply.
> 
> About “Options.v().set_dynamic_class()”, I found  no clear documents and examples so far.
> I tried to add following code after “G.reset()” in my “Tester”:
> 
> List<String> classes = new ArrayList<String>();
> classes.add("java.lang.ClassLoader");
> classes.add("java.lang.Class");
> classes.add("java.lang.reflect.Method");
> classes.add("java.lang.reflect.Field");
> Options.v().set_dynamic_class(classes);
> 
> But the results showed no differences.
> I’m wondering if I used it in a wrong way or it may be not related?  
> 
> Best Regard
> ——————————————————
> Jun Gao
> 
> University of Luxembourg, SnT
> 6 Rue Richard Coudenhove-Kalergi
> L-1359 Luxembourg
> Office: Bloc E 107
> Tele: (+352) 46 66 44 6019
> Fax: (+352) 46 66 44 36019
> 
> 
> 
> 
> 
>> On 10 Dec 2019, at 21:12, David Diepenbrock <ddiepenbrock at pjrcorp.com> wrote:
>> 
>> Jun,
>> 
>> Try looking into "Options.v().set_dynamic_class()".  In my limited experience spark needs a list of the dynamically loaded classes in order to identify the reflective method invokes. 
>> 
>> -David
>> From: Soot-list <soot-list-bounces at CS.McGill.CA> on behalf of Jun GAO <jun.gao at uni.lu>
>> Sent: Monday, December 9, 2019 4:31 AM
>> To: soot-list at cs.mcgill.ca <soot-list at CS.McGill.CA>
>> Subject: [Soot-list] Pointsto analysis for reflection methods
>>  
>> Hi there,
>> 
>> I’m trying to tracking the usage of certain object returned from Java reflection methods by using SPARK PointsTo analysis.
>> Hereafter is the code of a simple test case:
>> 
>> import java.lang.reflect.Method;
>> import java.lang.reflect.Constructor;
>> import java.lang.Class;
>> import java.lang.reflect.InvocationTargetException;
>> 
>> public class Testcase {
>> 
>>     public static void main(String[] args) {
>>         try{
>>             Class cdog = Class.forName("Dog");
>>             Method mbark = cdog.getMethod("bark");
>>             mbark.invoke(null);
>>         } catch(ClassNotFoundException e) {
>>             e.printStackTrace();
>>         } catch(NoSuchMethodException e) {
>>             e.printStackTrace();
>>         } catch(InvocationTargetException e) {
>>             e.printStackTrace();
>>         } catch(IllegalAccessException e) {
>>             e.printStackTrace();
>>         }
>>     }
>> 
>> }
>> 
>> 
>> By using the points-to analysis, I want to know that the “cdog” in statement "Class cdog = Class.forName("Dog”);” is the one in statement "Method mbark = cdog.getMethod("bark”);”.
>> Also, the “mbark” in statement "mbark.invoke(null);” is the one got before.
>> However, the points-to set from the points-to analysis for all these local variables are “EmptyPointsToSet”.
>> 
>> Following is the code for analysis by using Soot:
>> 
>> public class Tester {
>> public static void main(String[] args) {
>> String[] opts = {
>>          "-process-dir", "../pointsto_test_case/",
>>          "-ire",
>>          "-allow-phantom-refs",
>>          "-src-prec", "c",
>>          "-w",
>>          "-p", "cg", "enabled:true",
>>          "-p", "cg", "all-reachable:true",
>>          "-p", "cg", "trim-clinit:false",
>>          "-p", "cg.spark", "on",
>>          "-p", "cg.spark", "verbose:true",
>>          "-p", "cg.spark", "propagator:worklist",
>>          "-p", "cg.spark", "simple-edges-bidirectional:false",
>>          "-p", "cg.spark", "on-fly-cg:true",
>>          "-p", "cg.spark", "set-impl:double",
>>          "-p", "cg.spark", "double-set-old:hybrid",
>>          "-p", "cg.spark", "double-set-new:hybrid",
>>          "-p", "jop.cpf", "enabled:true",
>>          "-output-format", "n"
>>      };
>>      G.reset();
>> PackManager.v().getPack("wjtp").add(new Transform("wjtp.test", new SceneTransformer() {
>>        @Override
>>        protected void internalTransform(String phaseName, Map<String, String> options) {
>> PointsToAnalysis pa = Scene.v().getPointsToAnalysis();
>>          ReachableMethods reachableMethods = Scene.v().getReachableMethods();
>>          QueueReader<MethodOrMethodContext> listener = reachableMethods.listener();
>>          while (listener.hasNext()) {
>>          
>>  SootMethod m = listener.next().method();
>> 
>>            if (!m.getDeclaringClass().getName().equals("Testcase")) continue;
>> 
>>            if (m.hasActiveBody()) {
>>             Local cls = null, method = null;
>>              Stmt clsStmt = null, methodStmt = null;
>>              Body body = m.getActiveBody();
>>              for (Unit u : body.getUnits()) {
>>                Stmt stmt = (Stmt) u;
>>                if (stmt.containsInvokeExpr()) {
>>                   InvokeExpr ie = stmt.getInvokeExpr();
>>                   if (ie.getMethod().getName().equals("forName")) {
>>                      cls = (Local) ((AssignStmt) stmt).getLeftOp();
>>                      clsStmt = stmt;
>>                   } else if (ie.getMethod().getName().equals("getMethod")) {
>>                      AssignStmt astmt = (AssignStmt) stmt;
>>                    method = (Local) astmt.getLeftOp();
>>                    methodStmt = stmt;
>>                      Local invoker = (Local) ((InstanceInvokeExpr) ie).getBase();
>>                      PointsToSet clsPs = pa.reachingObjects(cls);
>>                      System.out.println(clsPs.getClass());
>>                      PointsToSet invokerPs = pa.reachingObjects(invoker);
>>                      System.out.println(invokerPs.getClass());
>>                      if (clsPs.hasNonEmptyIntersection(invokerPs)) {
>>                       System.out.println(clsStmt);
>>                        System.out.println(methodStmt);
>>                      }
>>                   } else if (ie.getMethod().getName().equals("invoke")) {
>>                      Local invoker = (Local) ((InstanceInvokeExpr) ie).getBase();
>>                      PointsToSet methodPs = pa.reachingObjects(method);
>>                      System.out.println(methodPs.getClass());
>>                      PointsToSet invokerPs = pa.reachingObjects(invoker);
>>                      System.out.println(invokerPs.getClass());
>>                      if (methodPs.hasNonEmptyIntersection(invokerPs)) {
>>                        System.out.println(methodStmt);
>>                        System.out.println(stmt);
>>                      }
>>                   }
>>                }
>>              }
>> }
>> }
>> }
>> }
>> }
>> 
>> I tried the points-to analysis with object instantiated with new statement which works very well.
>> And I also noticed that these reflection methods were somehow related to native code.
>> So I’m wandering are there some other parameters required for the points-to analysis to work properly for this situation?
>> Or it cannot work with it?
>> 
>> 
>> Best Regard
>> ——————————————————
>> Jun Gao
>> 
>> University of Luxembourg, SnT
>> 6 Rue Richard Coudenhove-Kalergi
>> L-1359 Luxembourg
>> Office: Bloc E 107
>> Tele: (+352) 46 66 44 6019
>> Fax: (+352) 46 66 44 36019
> 
> _______________________________________________
> Soot-list mailing list
> Soot-list at CS.McGill.CA
> https://mailman.CS.McGill.CA/mailman/listinfo/soot-list



More information about the Soot-list mailing list