[Soot-list] Re: Exception Table

Silviu ANDRICA silviu.andrica at epfl.ch
Wed Jul 9 12:25:20 EDT 2008


Hello,
    Thanks for replying so quick.

The Source code is:


public class Test {
    public void m0() {
        synchronized (this) {
            synchronized ("Hello") {
                System.out.println("Hello World");
            }

        }
    }
}

The Jimple version, for the m0 method only,  is:
public void m0()
    {
        Test r0, r2;
        java.lang.String r3, $r4;
        java.io.PrintStream $r5;
        java.lang.Throwable $r6, $r7;

        r0 := @this: Test;
        r2 = r0;
        entermonitor r0;

     label0:
        $r4 = "Hello";
        r3 = $r4;
        entermonitor $r4;

     label1:
        $r5 = <java.lang.System: java.io.PrintStream out>;
        virtualinvoke $r5.<java.io.PrintStream: void 
println(java.lang.String)>("Hello World");
        exitmonitor r3;

     label2:
        goto label6;

     label3:
        $r6 := @caughtexception;

     label4:
        exitmonitor r3;

     label5:
        throw $r6;

     label6:
        exitmonitor r2;

     label7:
        goto label11;

     label8:
        $r7 := @caughtexception;

     label9:
        exitmonitor r2;

     label10:
        throw $r7;

     label11:
        return;

        catch java.lang.Throwable from label1 to label2 with label3;
        catch java.lang.Throwable from label4 to label5 with label3;
        catch java.lang.Throwable from label0 to label7 with label8;
        catch java.lang.Throwable from label9 to label10 with label8;
    }
    The problem is the same, "label 3" is not caught by itself.

Best regards,
    Silviu
Silviu ANDRICA wrote:
> Hello,
>     I am trying to develop a static analysis for Java applications and I
> have to deal with Control Flow Graphs. In this endeavour I found a
> "problem" relating to the Exception table translation from Java bytecode
> to Baf.
>
> Consider, for example, the following method:
>
> public void m0();
>   Code:
>    0:    aload_0
>    1:    dup
>    2:    astore_1
>    3:    monitorenter
>    4:    ldc    #16; //String Hello
>    6:    dup
>    7:    astore_2
>    8:    monitorenter
>    9:    getstatic    #18; //Field
> java/lang/System.out:Ljava/io/PrintStream;
>    12:    ldc    #24; //String Hello World
>    14:    invokevirtual    #26; //Method
> java/io/PrintStream.println:(Ljava/lang/String;)V
>    17:    aload_2
>    18:    monitorexit
>    19:    goto    25
>    22:    aload_2
>    23:    monitorexit
>    24:    athrow
>    25:    aload_1
>    26:    monitorexit
>    27:    goto    33
>    30:    aload_1
>    31:    monitorexit
>    32:    athrow
>    33:    return
>   Exception table:
>    from   to  target type
>      9    19    22   any
>     22    24    22   any
>      4    27    30   any
>     30    32    30   any
>
> In this case, instructions 22 and 23, corresponding to an exception
> handler, are caught by themselves. So, any exception thrown in this
> exception handler can't escape it. It is the same for the second
> exception handler.
>
> When translating it to Baf, the following code results:
>
>  public void m0()
>     {
>         word r0, r2, $r6;
>
>         r0 := @this: Test;
>         load.r r0;
>         store.r r2;
>         load.r r0;
>         entermonitor;
>
>      label0:
>         push "Hello";
>         dup1.r;
>         store.r r0;
>         entermonitor;
>
>      label1:
>         staticget <java.lang.System: java.io.PrintStream out>;
>         push "Hello World";
>         virtualinvoke <java.io.PrintStream: void println(java.lang.String)>;
>         load.r r0;
>         exitmonitor;
>
>      label2:
>         goto label6;
>
>      label3:
>         store.r $r6;
>
>      label4:
>         load.r r0;
>         exitmonitor;
>
>      label5:
>         load.r $r6;
>         athrow;
>
>      label6:
>         load.r r2;
>         exitmonitor;
>
>      label7:
>         goto label11;
>
>      label8:
>         store.r $r6;
>
>      label9:
>         load.r r2;
>         exitmonitor;
>
>      label10:
>         load.r $r6;
>         athrow;
>
>      label11:
>         return;
>
>         catch java.lang.Throwable from label1 to label2 with label3;
>         catch java.lang.Throwable from label4 to label5 with label3;
>         catch java.lang.Throwable from label0 to label7 with label8;
>         catch java.lang.Throwable from label9 to label10 with label8;
>     }
> The Baf translation adds, for the first trap, "label3: store.r $r6;".
> The problem is that, now an exceptional edge from it to the second trap
> handler: "label8: store.r $r6;" which does not guarantee that the second
> acquired lock is released: if the first exitmonitor fails and then
> "label 3" fails, then control reaches "label 8" and then only one, the
> first, lock is released.
>
> Any ideas how to solve this?
>
> Best regards,
>     Silviu
>
>
>
>   



More information about the Soot-list mailing list