[Soot-list] Help needed with ThreadLocalObjectsAnalysis

Arie Zilberstein arie.zilberstein at gmail.com
Fri Sep 4 19:52:26 EDT 2009


Hi,

 

This is the relevant part of the output.

The Publish class is the same as appears below. The Publish$1 class is the
anonymous class which implements the Runner interface.

 

[Call Graph] For information on where the call graph may be incomplete, use
the verbose option to the cg phase.

[Spark] Pointer Assignment Graph in 1.6 seconds.

[Spark] Type masks in 0.4 seconds.

[Spark] Pointer Graph simplified in 0.0 seconds.

[Spark] Propagation in 51.1 seconds.

[Spark] Solution found in 51.1 seconds.

[local-objects] Analyzing local objects for cases.publish.Publish$1

[local-objects]   preparing class             Sat Sep 05 01:47:11 GMT+02:00
2009

[local-objects]   analyzing class             Sat Sep 05 01:47:11 GMT+02:00
2009

[local-objects]   propagating over call graph Sat Sep 05 01:47:11 GMT+02:00
2009

[local-objects]   finished at                 Sat Sep 05 01:47:11 GMT+02:00
2009

[local-objects]   (#analyzed/#encountered): 8/16

[local-objects] Analyzing local objects for cases.publish.Publish

[local-objects]   preparing class             Sat Sep 05 01:47:11 GMT+02:00
2009

[local-objects]   analyzing class             Sat Sep 05 01:47:11 GMT+02:00
2009

[local-objects]   propagating over call graph Sat Sep 05 01:47:11 GMT+02:00
2009

[local-objects]   finished at                 Sat Sep 05 01:47:11 GMT+02:00
2009

[local-objects]   (#analyzed/#encountered): 26/58

 

 

Best,

Arie

 

From: richardlhalpert at gmail.com [mailto:richardlhalpert at gmail.com] On Behalf
Of Richard L. Halpert
Sent: Friday, September 04, 2009 8:01 PM
To: Arie Zilberstein
Cc: Eric Bodden; soot-list at sable.mcgill.ca
Subject: Re: [Soot-list] Help needed with ThreadLocalObjectsAnalysis

 

Can you send the output of the MHP analysis and any other output you may be
getting?  I think this could be a bug.

-Richard

On Fri, Sep 4, 2009 at 11:13 AM, Arie Zilberstein
<arie.zilberstein at gmail.com> wrote:

OK,

----------------> Tested class code: <-----------
public class Publish {
       public static void main(String[] args) {
               Publish publish = new Publish();
               invokeThreadAccessSharedDummy();
               publish.test();
       }

       private static void invokeThreadAccessSharedDummy() {
               Thread t = new Thread(new Runnable() {

                       @Override
                       public void run() {
                               sharedDummy.integer = 20;
                               System.out.println("in thread!");
                       }
               });
               t.start();

       }

       Dummy d;
       static Dummy sharedDummy;

       private void test() {

               // d is local
               d = new Dummy();
               d.integer = 5;

               // publish d
               sharedDummy = d;

               // d is now shared
               d.integer = 10;
       }
}

----------------> Class invoking TLOA <-------------
public class ThreadLocalSceneTransformer extends SceneTransformer {

       private static Transformer instance = new
ThreadLocalSceneTransformer();
       private ThreadLocalObjectsAnalysis tloa;

       public static Transformer v() {
               return instance;
       }

       private ThreadLocalObjectsAnalysis getTLOA() {

               MhpTester mhp = new SynchObliviousMhpAnalysis();
               ThreadLocalObjectsAnalysis tloa = new
ThreadLocalObjectsAnalysis(mhp);

               return tloa;
       }

       @Override
       protected void internalTransform(String phaseName, Map options) {
               tloa = getTLOA();
               iterateAllMethods();
       }

       private void iterateAllMethods() {

               // Find methods
               Iterator<SootClass> getClassesIt =
Scene.v().getApplicationClasses()
                               .iterator();
               while (getClassesIt.hasNext()) {
                       SootClass appClass = getClassesIt.next();
                       Iterator<SootMethod> getMethodsIt =
appClass.getMethods()
                                       .iterator();
                       while (getMethodsIt.hasNext()) {
                               SootMethod method = getMethodsIt.next();
                               analyzeMethod(method);
                       }
               }
       }

       private void analyzeMethod(SootMethod method) {
               if (!method.hasActiveBody()) {
                       return;
               }
               Body activeBody = method.getActiveBody();

               List<ValueBox> useAndDefBoxes =
activeBody.getUseAndDefBoxes();
               for (ValueBox valueBox : useAndDefBoxes) {
                       Value value = valueBox.getValue();
                       if (value instanceof FieldRef) {
                               analyzeField(method, value);
                       }
               }
       }

       private void analyzeField(SootMethod method, Value value) {
               FieldRef fr = (FieldRef) value;
               boolean fieldIsThreadLocal = tloa.isObjectThreadLocal(fr,
method);
               if (fieldIsThreadLocal) {
                       // DISCOVERED A THREAD LOCAL FIELD, KEEP IT IN
DATABASE HERE...
               }
       }

}
----------------------------------------------

I inject the new transformer in the recommended way.
I use the following parameters on the main() method:

-cp <folder> -process-dir <folder> -d <output-folder> -pp -w -p cg.spark
enabled:true -p jb use-original-names:true -app -keep-bytecode-offset
-main-class Publish



Best,
Arie



-----Original Message-----
From: eric.bodden at googlemail.com [mailto:eric.bodden at googlemail.com] On
Behalf Of Eric Bodden
Sent: Friday, September 04, 2009 6:51 PM
To: Arie Zilberstein
Cc: soot-list at sable.mcgill.ca
Subject: Re: [Soot-list] Help needed with ThreadLocalObjectsAnalysis

Arie can you send us the complete examples? It's hard to tell form the
code fragment you send. In those cases details usually count.

Eric

2009/9/4 Arie Zilberstein <arie.zilberstein at gmail.com>:
> Hi,
>
>
>
> I'm experimenting with soot's ThreadLocalObjectsAnalysis class.
>
>
>
> I want to find out if a field of an object is thread-local or
thread-shared
> within a method. I realize that this may change over the lifetime of a
> single method. Look at this example:
>
>
>
> Dummy d;
>
> static Dummy sharedDummy;
>
>
>
> private void test() {
>
>       d = new Dummy(); // d is thread-local
>
>       d.integer = 5;
>
>
>
>       sharedDummy = d; // publish d; it is not thread-shared
>
>       d.integer = 10;
>
> }
>
>
>
> I used the ThreadLocalObjectsAnalysis object, hoping that it would
determine
> that the second write to d (d.integer=10) is to a field which is
> thread-shared, but for some reason, it deduced that the field is
> thread-local.
>
>
>
> I'm using the object like this:
>
> MhpTester mhp = new SynchObliviousMhpAnalysis();
>
>             ThreadLocalObjectsAnalysis tloa = new
> ThreadLocalObjectsAnalysis(mhp);
>
>             // later, given a value from a method
>
> boolean fieldIsThreadLocal = tloa.isObjectThreadLocal(value, method);
>
>
>
>
>
> I should note that, just before calling test(), I'm starting a thread
which
> deliberately sets sharedDummy.integer to 20. That's why I expect the
object
> stored in sharedDummy to be thread-shared.
>
>
>
> I would appreciate any help! Is this my misunderstanding? or a problem?
>
>
>
> Best,
>
> Arie
>
>
>
>
>
> _______________________________________________
> Soot-list mailing list
> Soot-list at sable.mcgill.ca
> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
>
>



--
Eric Bodden
Software Technology Group, Technische Universität Darmstadt, Germany
Tel: +49 6151 16-5478    Fax: +49 6151 16-5410
Mailing Address: S2|02 A209, Hochschulstraße 10, 64289 Darmstadt

_______________________________________________
Soot-list mailing list
Soot-list at sable.mcgill.ca
http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.cs.mcgill.ca/pipermail/soot-list/attachments/20090905/37b3d32e/attachment-0001.html 


More information about the Soot-list mailing list