[Soot-list] How to get signatures from a class that is at resolving level HIERARCHY

Hal Hildebrand hal.hildebrand at gmail.com
Tue Sep 21 11:26:46 EDT 2010


Unfortunately, I do not know the set of these classes before invoking - i.e.
these are determined during the transformation and can't be listed a priori.

:(

On Tue, Sep 21, 2010 at 1:29 AM, Eric Bodden <
bodden at st.informatik.tu-darmstadt.de> wrote:

> Hi again.
>
> I think the following should work. Insert the following call *before*
> calling soot.Main.main(..):
>
>        Scene.v().addBasicClass("B", SootClass.SIGNATURES);
>
> Then Soot should actually take care of the rest. The above call will
> cause Soot to reolve B all the way to signatures when B is requested.
>
> Eric
>
> --
> Dr. 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
>
>
>
> On 21 September 2010 05:39, Hal Hildebrand <hal.hildebrand at gmail.com>
> wrote:
> > Okay, looking into this some more I find myself a bit confused as to
> what's exactly happening.  I've appended the stack trace below for context.
> >
> > The class I'm trying to load hasn't been brought in and resolved, which I
> had mistakenly assumed was the case.  From my tracing of the logic, things
> seem to get out of whack because in SootResolver.bringToHierarchy() (line
> 183), the resolve level is set to HIERARCHY, regardless of what the desired
> level is - in this case SIGNATURES.  The problem with this is that
> SootClass.addField() requires the resolveLevel to be >= Signatures, and thus
> the raised RunTimeException.
> >
> > I'm unclear of the logic here, as if any class that is being resolved to
> signatures would seem to have gone through this chain, but for this
> particular use case it's failing.  My naive thought would be that the
> bringToHierarchy should be checking that the level is >= HIERARCHY and
> setting it if it's not, but given that the existing logic works in all but
> this particular case I'm loathe to tug on that for fear of unravelling other
> threads.
> >
> > Thread [main] (Suspended (exception RuntimeException))
> >        SootClass.checkLevel(int) line: 121
> >        SootClass.addField(SootField) line: 177
> >        Util.resolveFromClassFile(SootClass, InputStream, List) line: 147
> >        CoffiClassSource.resolve(SootClass) line: 39
> >        SootResolver.bringToHierarchy(SootClass) line: 215
> >        SootResolver.bringToSignatures(SootClass) line: 239
> >        SootResolver.bringToBodies(SootClass) line: 280
> >        SootResolver.processResolveWorklist() line: 150
> >        SootResolver.resolveClass(String, int) line: 124
> >        EntityConstructionTransformer.transform(NewExpr, Unit,
> PatchingChain<Unit>) line: 68
> >        EntityConstructionTransformer.internalTransform(Body, String, Map)
> line: 110
> >        EntityConstructionTransformer(BodyTransformer).transform(Body,
> String, Map) line: 51
> >        Transform.apply(Body) line: 104
> >        BodyPack.internalApply(Body) line: 49
> >        BodyPack(Pack).apply(Body) line: 124
> >        PackManager.runBodyPacks(SootClass) line: 784
> >        PackManager.runBodyPacks(Iterator) line: 463
> >        PackManager.runBodyPacks() line: 380
> >        PackManager.runPacks() line: 357
> >        Main.run(String[]) line: 198
> >        Main.main(String[]) line: 141
> >        SimulationTransform.main(String[]) line: 88
> >        TestMe.main(String[]) line: 24
> >
> >
> > On Sep 20, 2010, at 6:37 PM, Hal Hildebrand wrote:
> >
> >> Unfortunately, that leads to the same fail:
> >>
> >> Exception in thread "main" java.lang.RuntimeException:
> >>       This operation requires resolving level SIGNATURES but
> testClasses.DriverImpl$entity is at resolving level HIERARCHY
> >> If you are extending Soot, try to add the following call before calling
> soot.Main.main(..):
> >>
> >> On Sep 19, 2010, at 11:30 PM, Eric Bodden wrote:
> >>
> >>> Hal, the following method could work:
> >>>
> >>> soot.SootResolver.v().resolveClass("B", SootClass.SIGNATURES);
> >>>
> >>> Eric
> >>>
> >>> --
> >>> Dr. 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
> >>>
> >>>
> >>>
> >>> On 20 September 2010 05:55, Hal Hildebrand <hal.hildebrand at gmail.com>
> wrote:
> >>>> So, I seem to be back in the weeds again.  Not sure if there's a way
> out, but I thought I'd ask the list for suggestions.
> >>>>
> >>>> I'm using the set_no_bodies_for_excluded option, and all that implies.
>  The setup is that I have three classes, A, B and C.  A and B are on the
> soot class path, and are excluded.  C is being processed, and in the body of
> a method of C I am transforming a method invocation on A to B.  I have the
> method reference to the method on A, and although the method is declared on
> B, I cannot retrieve the method reference because B is pinned at resolving
> level HIERARCHY.
> >>>>
> >>>> I believe I understand why this is happening, given that I do not
> reference B and thus the class is without method signatures.  What I am
> wondering  is whether there is some clever way around this trap I've set for
> myself.  The reason I'm using the set_no_bodies_for_excluded is because I
> cannot transform any method outside of the processing set and things get
> ugly pretty fast if I don't use that option.  Hopefully there's a way out of
> this, though.
> >>>>
> >>>> Thanks,
> >>>>
> >>>> -Hal
> >>>> _______________________________________________
> >>>> 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/20100921/af059932/attachment-0001.html 


More information about the Soot-list mailing list