[Soot-list] CallGraph exception

Andrea Mattavelli andrea.mattavelli at usi.ch
Fri Jun 22 11:43:54 EDT 2012


Hi everybody,
unfortunately, I have another issue during call graph creation.
I'm trying yo create the whole call graph of closure-compiler (https://code.google.com/p/closure-compiler/) but during the transformation I obtain the following exception:

Soot started on Fri Jun 22 16:12:21 CEST 2012
[Call Graph] For information on where the call graph may be incomplete, use the verbose option to the cg phase.
Exception in thread "main" soot.AbstractSootFieldRef$FieldResolutionFailedException: Class com.google.javascript.jscomp.DefaultPassConfig$99 doesn't have field this$0 : com.google.javascript.jscomp.DefaultPassConfig; failed to resolve in superclasses and interfacesLooking in com.google.javascript.jscomp.DefaultPassConfig$99 which has fields [<com.google.javascript.jscomp.DefaultPassConfig$99: java.util.Collection val$passes>]
Looking in com.google.javascript.jscomp.CompilerPass which has fields []
Looking in java.lang.Object which has fields []

at soot.AbstractSootFieldRef.resolve(AbstractSootFieldRef.java:116)
at soot.AbstractSootFieldRef.resolve(AbstractSootFieldRef.java:75)
at soot.jimple.internal.AbstractInstanceFieldRef.getField(AbstractInstanceFieldRef.java:90)
at soot.jimple.toolkits.typing.fast.AugEvalFunction.eval_(AugEvalFunction.java:195)
at soot.jimple.toolkits.typing.fast.AugEvalFunction.eval(AugEvalFunction.java:41)
at soot.jimple.toolkits.typing.fast.TypeResolver.applyAssignmentConstraints(TypeResolver.java:407)
at soot.jimple.toolkits.typing.fast.TypeResolver.inferTypes(TypeResolver.java:113)
at soot.jimple.toolkits.typing.TypeAssigner.internalTransform(TypeAssigner.java:101)
at soot.BodyTransformer.transform(BodyTransformer.java:51)
at soot.Transform.apply(Transform.java:104)
at soot.JimpleBodyPack.applyPhaseOptions(JimpleBodyPack.java:66)
at soot.JimpleBodyPack.internalApply(JimpleBodyPack.java:89)
at soot.Pack.apply(Pack.java:124)
at soot.coffi.CoffiMethodSource.getBody(CoffiMethodSource.java:117)
at soot.SootMethod.getBodyFromMethodSource(SootMethod.java:89)
at soot.SootMethod.retrieveActiveBody(SootMethod.java:322)
at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processNewMethod(OnFlyCallGraphBuilder.java:531)
at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processReachables(OnFlyCallGraphBuilder.java:426)
at soot.jimple.toolkits.callgraph.CallGraphBuilder.build(CallGraphBuilder.java:84)
at soot.jimple.toolkits.callgraph.CHATransformer.internalTransform(CHATransformer.java:43)
at soot.SceneTransformer.transform(SceneTransformer.java:39)
at soot.Transform.apply(Transform.java:89)
at soot.RadioScenePack.internalApply(RadioScenePack.java:57)
at soot.jimple.toolkits.callgraph.CallGraphPack.internalApply(CallGraphPack.java:49)
at soot.Pack.apply(Pack.java:114)
at soot.PackManager.runWholeProgramPacks(PackManager.java:417)
at soot.PackManager.runPacks(PackManager.java:336)
at soot.Main.run(Main.java:198)
at soot.Main.main(Main.java:141)
at Main.main(Main.java:41)


The byte code of the class com.google.javascript.jscomp.DefaultPassConfig$99 causing the exception is the following:

Compiled from "DefaultPassConfig.java"
class com.google.javascript.jscomp.DefaultPassConfig$99 extends java.lang.Object implements com.google.javascript.jscomp.CompilerPass{
com.google.javascript.jscomp.DefaultPassConfig$99(java.util.Collection);
  Code:
   0: aload_0
   1: aload_1
   2: putfield #12; //Field val$passes:Ljava/util/Collection;
   5: aload_0
   6: invokespecial #14; //Method java/lang/Object."<init>":()V
   9: return

public void process(com.google.javascript.rhino.Node, com.google.javascript.rhino.Node);
  Code:
   0: aload_0
   1: getfield #12; //Field val$passes:Ljava/util/Collection;
   4: invokeinterface #23,  1; //InterfaceMethod java/util/Collection.iterator:()Ljava/util/Iterator;
   9: astore 4
   11: goto 33
   14: aload 4
   16: invokeinterface #29,  1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
   21: checkcast #5; //class com/google/javascript/jscomp/CompilerPass
   24: astore_3
   25: aload_3
   26: aload_1
   27: aload_2
   28: invokeinterface #35,  3; //InterfaceMethod com/google/javascript/jscomp/CompilerPass.process:(Lcom/google/javascript/rhino/Node;Lcom/google/javascript/rhino/Node;)V
   33: aload 4
   35: invokeinterface #37,  1; //InterfaceMethod java/util/Iterator.hasNext:()Z
   40: ifne 14
   43: return

}


And its Java source code is this one:

  private static CompilerPass runInSerial(final Collection<CompilerPass> passes) {
    return new CompilerPass() {
      @Override public void process(Node externs, Node root) {
        for (CompilerPass pass : passes) {
          pass.process(externs, root);
        }
      }
    };
  }


To better identify the root cause of the problem, I tried to use the "use-original-names:true" option to pinpoint the field involved in the failure (this$0). However, I obtained another exception:

java.lang.Exception: null typing passed to useChecker
at soot.jimple.toolkits.typing.fast.UseChecker.check(UseChecker.java:50)
at soot.jimple.toolkits.typing.fast.TypeResolver.insertCasts(TypeResolver.java:345)
at soot.jimple.toolkits.typing.fast.TypeResolver.inferTypes(TypeResolver.java:124)
at soot.jimple.toolkits.typing.TypeAssigner.internalTransform(TypeAssigner.java:101)
at soot.BodyTransformer.transform(BodyTransformer.java:51)
at soot.Transform.apply(Transform.java:104)
at soot.JimpleBodyPack.applyPhaseOptions(JimpleBodyPack.java:66)
at soot.JimpleBodyPack.internalApply(JimpleBodyPack.java:89)
at soot.Pack.apply(Pack.java:124)
at soot.coffi.CoffiMethodSource.getBody(CoffiMethodSource.java:117)
at soot.SootMethod.getBodyFromMethodSource(SootMethod.java:89)
at soot.SootMethod.retrieveActiveBody(SootMethod.java:322)
at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processNewMethod(OnFlyCallGraphBuilder.java:531)
at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processReachables(OnFlyCallGraphBuilder.java:426)
at soot.jimple.toolkits.callgraph.CallGraphBuilder.build(CallGraphBuilder.java:84)
at soot.jimple.toolkits.callgraph.CHATransformer.internalTransform(CHATransformer.java:43)
at soot.SceneTransformer.transform(SceneTransformer.java:39)
at soot.Transform.apply(Transform.java:89)
at soot.RadioScenePack.internalApply(RadioScenePack.java:57)
at soot.jimple.toolkits.callgraph.CallGraphPack.internalApply(CallGraphPack.java:49)
at soot.Pack.apply(Pack.java:114)
at soot.PackManager.runWholeProgramPacks(PackManager.java:417)
at soot.PackManager.runPacks(PackManager.java:336)
at soot.Main.run(Main.java:198)
at soot.Main.main(Main.java:141)
at Main.main(Main.java:42)


Does anybody have an idea of the possible source of this problem?

Thanks in advance for any suggestions!

Andrea
_______________________________

Andrea Mattavelli

PhD Student
Faculty of Informatics
University of Lugano
via G. Buffi 13
CH-6900 Lugano - Switzerland

email:    andrea.mattavelli at usi.ch<mailto:andrea.mattavelli at usi.ch>
phone:  +41 58 666 4312
http://star.inf.usi.ch<http://star.inf.usi.ch/>


ps: I'm executing Soot using this simple program

public static void main(String args[]){
soot.options.Options.v().set_soot_classpath(...);
soot.options.Options.v().set_whole_program(true);
soot.options.Options.v().allow_phantom_refs();
soot.options.Options.v().setPhaseOption("jb","use-original-names:true");

PackManager.v().getPack("wjtp").add(new Transform("wjtp.myTrans", new SceneTransformer() {

@Override
protected void internalTransform(String arg0, Map arg1) {

}
}));

soot.Main.main(new String[]{
"-main-class", "com.google.javascript.jscomp.CommandLineRunner",
"-process-dir", ".../closure-compiler/build/classes"
});
}



More information about the Soot-list mailing list