[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
read/write sets for a Unit
Hello,
I'm curious as to what the correct way to access read/write sets for a
given Unit is from within a BodyTransformer. I'm assuming that what
I'm doing is violating some precondition on the SideEffectTester code,
because it's not working. (Therefore, the rest of this message, which
explains what I am doing now, can probably be skimmed or skipped if
it's clearly wrong.)
Right now, what I'm doing is pretty convoluted (and I'm pretty sure
that it's wrong -- both a priori and because I get occasional
ClassCastExceptions from deep within soot code). My basic approach is
to override PASideEffectTester with a class that will let me access the
fields in readSet() and writeSet(), instantiate that class in my
BodyTransformer and invoke its newMethod method with the Method
corresponding to the current Body, and then invoking the methods on my
SideEffectTester-derived class that return the getFields() set from the
RWSets returned by readSet and writeSet. I then run soot in
whole-program mode, enabling spark (my transformation is in the jtp
pack).
Occasionally, I'll get exceptions like the following. These occur when
analyzing method invocations. It's not clear to me that a particular
class of method invocations (i.e. special, static, or virtual) is the
culprit; if I catch these exceptions, I can see that some will fail and
some will not. Overall, it appears that between 5-45% of attempts to
analyze method invocations fail, depending on what program I'm
analyzing.
Exception in thread "main" java.lang.ClassCastException
at
soot.jimple.toolkits.pointer.SideEffectAnalysis.findNTRWSets(SideEffectA
nalysis.java:44)
at
soot.jimple.toolkits.pointer.SideEffectAnalysis.nonTransitiveReadSet(Sid
eEffectAnalysis.java:57)
at
soot.jimple.toolkits.pointer.SideEffectAnalysis.readSet(SideEffectAnalys
is.java:90)
at
soot.jimple.toolkits.pointer.PASideEffectTester.readSet(PASideEffectTest
er.java:65)
at
com.willbenton.sootPasses.wbSideEffectMarker$csssemSideEffectTester.read
Fields(wbSideEffectMarker.java:13)
at
com.willbenton.sootPasses.wbSideEffectMarker.actualTransform(wbSideEffec
tMarker.java:90)
at
com.willbenton.sootPasses.cwsBaseBodyTransformer.internalTransform(cwsBa
seBodyTransformer.java:32)
at soot.BodyTransformer.transform(BodyTransformer.java:51)
at soot.Transform.apply(Transform.java:88)
at soot.BodyPack.internalApply(BodyPack.java:44)
at soot.Pack.apply(Pack.java:110)
at soot.PackManager.runBodyPacks(PackManager.java:423)
at soot.PackManager.runBodyPacks(PackManager.java:282)
at soot.PackManager.runPacks(PackManager.java:241)
at soot.Main.run(Main.java:172)
at soot.Main.main(Main.java:152)
at
com.willbenton.sootPasses.wbSideEffectMarker.main(wbSideEffectMarker.jav
a:125)
Thanks for any help!
wb
---
Will Benton <willb@cs.wisc.edu>
"Wir sind Bettler, das ist wahr"
recently updated (11/1/03) contact info at:
http://www.cs.wisc.edu/~willb/willb.vcf