[Soot-list] Paddle: getting updated version of context sensitive call graph/points-to sets

Christophe Foket christophe.foket at elis.ugent.be
Tue Mar 22 09:07:36 EDT 2011


For those of you who might be interested, I think I have found a 
solution to my problem.

For Spark:

     private static void runSpark(){

         Scene.v().releaseCallGraph();
         Scene.v().releasePointsToAnalysis();
         Scene.v().releaseReachableMethods();
         Scene.v().releaseFastHierarchy();
         Scene.v().releaseActiveHierarchy();

         G.v().MethodPAG_methodToPag = new HashMap<SootMethod, MethodPAG>();
         SootBridge.removeTransform("wjap", "wjap.guards");

         PackManager.v().getPack("cg").apply();
     }

     public static void removeTransform(String packName, String 
transformName){

         Pack pack = PackManager.v().getPack(packName);
         Transform transform = pack.get(transformName);
         pack.opts.remove(transform);
     }

For Paddle:

     private static void runPaddle(){

         Scene.v().releaseCallGraph();
         Scene.v().releasePointsToAnalysis();
         Scene.v().releaseReachableMethods();
         Scene.v().releaseFastHierarchy();
         Scene.v().releaseActiveHierarchy();

         SootBridge.nullifyContextNumberer();

         PackManager.v().getPack("cg").apply();
     }

     public static void nullifyContextNumberer(){

         Scene.v().contextNumberer = null;
     }

(soot.SootBridge is a class I made to get access to some fields of Scene 
and Pack)

At first sight, both methods seem to calculate an updated version of the 
call graph and the points-to sets. However, I have not tested them 
extensively.

Kind Regards,

Christophe

On 03/21/2011 06:11 PM, Christophe Foket wrote:
> This seems to work. However, G.reset() also removes the current Scene,
> which results in further problems. I've tried various things like
> copying the classes from the old Scene to the new Scene or even changing
> the new Scene back to the old Scene using
>
>               Field sceneField =
> Singletons.class.getDeclaredField("instance_soot_Scene");
>               sceneField.setAccessible(true);
>               sceneField.set(G.v(), oldScene);
>
> However, none of these hacks seem to result in anything useful.
>
> Christophe
>
> On 03/18/2011 09:09 PM, Ondrej Lhotak wrote:
>> The only reliable way to clear the existing state of Soot (and Paddle)
>> that I'm aware of is with G.reset().
>>
>> Ondrej
>>
>> On Wed, Mar 16, 2011 at 11:28:03PM +0100, Christophe Foket wrote:
>>> Hello,
>>>
>>> I was wondering what the best way is to rerun Paddle to get an updated
>>> version of the context sensitive call graph/points to sets. I've tried using
>>>
>>>          Scene.v().releaseReachableMethods();
>>>          Scene.v().releaseCallGraph();
>>>          Scene.v().releasePointsToAnalysis();
>>>          Scene.v().contextNumberer = null;
>>>
>>>          PaddleOptions options = new PaddleOptions(paddleOptions);
>>>          PaddleTransformer paddleTransformer = PaddleTransformer.v();
>>>          paddleTransformer.setup(options);
>>>          paddleTransformer.solve(options);
>>>
>>> where paddleOptions is a HashMap containing the same key-value mapping
>>> as the options that were given to Soot.
>>>
>>> However, this does not seem to be working, as some of the points-to sets
>>> are empty after re-runing Paddle this way.
>>> For example, I have the following problem:
>>>
>>>          Local local = ...
>>>
>>> System.out.println(Scene.v().getPointsToAnalysis().reachingObjects(local).possibleTypes().size());
>>> // prints "1"
>>>
>>>          Scene.v().releaseReachableMethods();
>>>          Scene.v().releaseCallGraph();
>>>          Scene.v().releasePointsToAnalysis();
>>>          Scene.v().contextNumberer = null;
>>>
>>>          PaddleOptions options = new PaddleOptions(paddleOptions);
>>>          PaddleTransformer paddleTransformer = PaddleTransformer.v();
>>>          paddleTransformer.setup(options);
>>>          paddleTransformer.solve(options);
>>>
>>>
>>> System.out.println(Scene.v().getPointsToAnalysis().reachingObjects(local).possibleTypes().size());
>>> // prints "0"
>>>
>>> Kind regards,
>>>
>>> Christophe
>>> _______________________________________________
>>> Soot-list mailing list
>>> Soot-list at sable.mcgill.ca
>>> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
>>>
> _______________________________________________
> Soot-list mailing list
> Soot-list at sable.mcgill.ca
> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list



More information about the Soot-list mailing list