[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Soot typing failure



While investigating...

SOOT PROBLEM #1
===============

        PackManager.v().getTransform( "jb.a" ).apply( b );
        PackManager.v().getTransform( "jb.ule" ).apply( b );

is applied BEFORE typing in soot-2.0.1/soot/src/soot/JimpleBodyPack.java

This is a bug of Soot.  Putting this code AFTER typing is the right approach
to solving the case of

public class Test2
{
    public void main()
    {
        if (null instanceof String)
            System.out.println("is String");
        else
            System.out.println("is not String");
    }
}

So with
    private void applyPhaseOptions(JimpleBody b, Map opts)
    {
        JBOptions options = new JBOptions( opts );

        if(options.use_original_names())
            PhaseOptions.v().setPhaseOptionIfUnset( "jb.lns", "only-stack-locals");

if(Options.v().time()) Timers.v().splitTimer.start();

PackManager.v().getTransform( "jb.ls" ).apply( b );

if(Options.v().time()) Timers.v().splitTimer.end();

if(Options.v().time()) Timers.v().assignTimer.start();

PackManager.v().getTransform( "jb.tr" ).apply( b );

if(Options.v().time()) Timers.v().assignTimer.end();

        if(typingFailed(b))
          throw new RuntimeException("type inference failed!");

        PackManager.v().getTransform( "jb.a" ).apply( b );
        PackManager.v().getTransform( "jb.ule" ).apply( b );
...

one gets:
 java soot.Main --soot-class-path /usr/lib/sablevm/classes-1.0.9:. -f jimple Test2

=>
$ cat sootOutput/Test2.jimple
public class Test2 extends java.lang.Object
{

    public void main()
    {
        Test2 r0;
        java.io.PrintStream $r1;

        r0 := @this: Test2;
        goto label0;

     label0:
        $r1 = <java.lang.System: java.io.PrintStream out>;
        virtualinvoke $r1.<java.io.PrintStream: void println(java.lang.String)>("is not String");
        return;
    }

    public void <init>()
    {
        Test2 r0;

        r0 := @this: Test2;
        specialinvoke r0.<java.lang.Object: void <init>()>();
        return;
    }
}


SOOT PROBLEM #2 ===============

In the code:

if(Options.v().time()) Timers.v().assignTimer.start();

PackManager.v().getTransform( "jb.tr" ).apply( b );

if(Options.v().time()) Timers.v().assignTimer.end();

        if(typingFailed(b))
          throw new RuntimeException("type inference failed!");

of soot-2.0.1/soot/src/soot/JimpleBodyPack.java,  verification of typing
failure is done EVEN WHEN typing is disabled!  (e.g. -p jb.tr enabled:false )

This is obviously a bug.

NOTE
====

I guess some people reordered soot phases without knowing the implications on
typing.  Also, not being able to get untyped jimple is a problem for debugging
the type-inference engine.  Please make sure it remains possible to get the
plain jimple sent to the type inference engine in a textual .jimple format.


REQUEST =======

Please let me know how I can get the jimple produced by

PackManager.v().getTransform( "jb.ls" ).apply( b );

just before calling the typing algorithm.

Thanks.

Etienne




Etienne Gagnon wrote:
Ondrej, what are the soot options to get the following:

I would like to get a .jimple dump of the code as handed to the typing algorithm.
(no optimization applied, just splitting according to used-def chains.)


The following does not work...

java soot.Main --app --soot-class-path /usr/lib/sablevm/classes-1.0.9:. -f jimple -p jb.tr enabled:false Test1

Etienne



--
Etienne M. Gagnon, Ph.D.             http://www.info.uqam.ca/~egagnon/
SableVM:                                       http://www.sablevm.org/
SableCC:                                       http://www.sablecc.org/