[Soot-list] Help needed with ThreadLocalObjectsAnalysis
Richard L. Halpert
richhal22 at gmail.com
Fri Sep 4 14:01:14 EDT 2009
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/20090904/0814d783/attachment.html
More information about the Soot-list
mailing list