[Soot-list] exception table question

Heejong Lee heejong at gmail.com
Thu Oct 11 04:18:57 EDT 2012


Hi Eric,

Thank you for your answer.
The exception table I attached was from following methods.
The first one is untyped and the second one is typed:

<net.youmi.android.appoffers.cj: boolean
a(android.content.Context,java.lang.String,java.lang.String)>
    private static boolean a(android.content.Context,
java.lang.String, java.lang.String)
    {
        unknown l0, l1, l2, l5, l3, l4, l6, $stack0#5, l4#2,
$stack0#15, l4#3, $stack0#21, l4#4, $stack0#22, l3#2, l6#2,
$stack0#29, l3#3, $stack0#30, l3#4, $stack0#31, l4#5, $stack0#32,
l4#6, $stack0#33, l4#7, $stack0#34, $stack0#35, l5#2, $stack0#37,
l4#8, $stack0#40, l5#3;

        l0 := @parameter0: android.content.Context;
        l1 := @parameter1: java.lang.String;
        l2 := @parameter2: java.lang.String;
        l5 = null;
        l3 = 0;
        l4 = 0;

     label0:
        $stack0#5 = virtualinvoke l0.<android.content.Context:
java.io.FileOutputStream openFileOutput(java.lang.String,int)>(l1,
l4);

     label1:
        l6 = $stack0#5;

     label2:
        l4#2 = new java.io.ObjectOutputStream;
        specialinvoke l4#2.<java.io.ObjectOutputStream: void
<init>(java.io.OutputStream)>(l6);

     label3:
        virtualinvoke l4#2.<java.io.ObjectOutputStream: void
writeUTF(java.lang.String)>(l2);

     label4:
        if l4#2 == null goto label6;

     label5:
        virtualinvoke l4#2.<java.io.ObjectOutputStream: void close()>();

     label6:
        if l6 == null goto label8;

     label7:
        virtualinvoke l6.<java.io.FileOutputStream: void close()>();

     label8:
        l3 = 1;

     label9:
        return l3;

     label10:
        $stack0#15 := @caughtexception;
        l4#3 = $stack0#15;
        l4#2 = l5;

     label11:
        if l4#2 == null goto label13;

     label12:
        virtualinvoke l4#2.<java.io.ObjectOutputStream: void close()>();

     label13:
        if l5 == null goto label9;

     label14:
        virtualinvoke l5.<java.io.FileOutputStream: void close()>();

     label15:
        goto label9;

     label16:
        $stack0#21 := @caughtexception;
        l4#4 = $stack0#21;
        goto label9;

     label17:
        $stack0#22 := @caughtexception;
        l3#2 = $stack0#22;
        l6#2 = l5;

     label18:
        if l5#2 == null goto label20;

     label19:
        virtualinvoke l5#2.<java.io.ObjectOutputStream: void close()>();

     label20:
        if l6#2 == null goto label22;

     label21:
        virtualinvoke l6#2.<java.io.FileOutputStream: void close()>();

     label22:
        throw l3#2;

     label23:
        $stack0#29 := @caughtexception;
        l3#3 = $stack0#29;
        goto label6;

     label24:
        $stack0#30 := @caughtexception;
        l3#4 = $stack0#30;
        goto label8;

     label25:
        $stack0#31 := @caughtexception;
        l4#5 = $stack0#31;
        goto label13;

     label26:
        $stack0#32 := @caughtexception;
        l4#6 = $stack0#32;
        goto label20;

     label27:
        $stack0#33 := @caughtexception;
        l4#7 = $stack0#33;
        goto label22;

     label28:
        $stack0#34 := @caughtexception;
        l3#2 = $stack0#34;
        goto label18;

     label29:
        $stack0#35 := @caughtexception;
        l3#2 = $stack0#35;
        l5#2 = l4;
        goto label18;

     label30:
        $stack0#37 := @caughtexception;
        l4#8 = $stack0#37;
        l4#2 = l5;
        l5 = l6;
        goto label11;

     label31:
        $stack0#40 := @caughtexception;
        l5#3 = $stack0#40;
        l5 = l6;
        goto label11;

        catch java.lang.Throwable from label0 to label1 with label10;
        catch java.lang.Throwable from label0 to label1 with label17;
        catch java.lang.Throwable from label2 to label3 with label30;
        catch java.lang.Throwable from label2 to label3 with label28;
        catch java.lang.Throwable from label3 to label4 with label31;
        catch java.lang.Throwable from label3 to label4 with label29;
        catch java.lang.Throwable from label5 to label6 with label23;
        catch java.lang.Throwable from label7 to label8 with label24;
        catch java.lang.Throwable from label12 to label13 with label25;
        catch java.lang.Throwable from label14 to label15 with label16;
        catch java.lang.Throwable from label19 to label20 with label26;
        catch java.lang.Throwable from label21 to label22 with label27;
    }


<net.youmi.android.appoffers.cj: boolean
a(android.content.Context,java.lang.String,java.lang.String)>
    private static boolean a(android.content.Context,
java.lang.String, java.lang.String)
    {
        android.content.Context r0;
        java.lang.String r1, r2;
        java.io.FileOutputStream r3, r4, $r5, r13;
        boolean z0;
        int i0, i1;
        java.lang.Object r6;
        java.lang.Throwable $r7, r8, $r9, r10, $r11, r12, $r14, r15,
$r16, r17, $r18, r19, $r20, r21, $r22, r23, $r24, $r25, $r26, r27,
$r28, r29;
        java.io.ObjectOutputStream r30, r31, r32, r33, r34;

        r0 := @parameter0: android.content.Context;
        r1 := @parameter1: java.lang.String;
        r2 := @parameter2: java.lang.String;
        r3 = null;
        z0 = 0;
        i0 = 0;

     label0:
        $r5 = virtualinvoke r0.<android.content.Context:
java.io.FileOutputStream openFileOutput(java.lang.String,int)>(r1,
i0);

     label1:
        r4 = $r5;

     label2:
        r30 = new java.io.ObjectOutputStream;
        r6 = r30;
        specialinvoke r30.<java.io.ObjectOutputStream: void
<init>(java.io.OutputStream)>(r4);

     label3:
        r31 = (java.io.ObjectOutputStream) r6;
        virtualinvoke r31.<java.io.ObjectOutputStream: void
writeUTF(java.lang.String)>(r2);

     label4:
        if r6 == null goto label6;

     label5:
        r32 = (java.io.ObjectOutputStream) r6;
        virtualinvoke r32.<java.io.ObjectOutputStream: void close()>();

     label6:
        if r4 == null goto label8;

     label7:
        virtualinvoke r4.<java.io.FileOutputStream: void close()>();

     label8:
        z0 = 1;

     label9:
        return z0;

     label10:
        $r7 := @caughtexception;
        r8 = $r7;
        r6 = r3;

     label11:
        if r6 == null goto label13;

     label12:
        r33 = (java.io.ObjectOutputStream) r6;
        virtualinvoke r33.<java.io.ObjectOutputStream: void close()>();

     label13:
        if r3 == null goto label9;

     label14:
        virtualinvoke r3.<java.io.FileOutputStream: void close()>();

     label15:
        goto label9;

     label16:
        $r9 := @caughtexception;
        r10 = $r9;
        goto label9;

     label17:
        $r11 := @caughtexception;
        r12 = $r11;
        r13 = r3;

     label18:
        if i1 == null goto label20;

     label19:
        r34 = (java.io.ObjectOutputStream) i1;
        virtualinvoke r34.<java.io.ObjectOutputStream: void close()>();

     label20:
        if r13 == null goto label22;

     label21:
        virtualinvoke r13.<java.io.FileOutputStream: void close()>();

     label22:
        throw r12;

     label23:
        $r14 := @caughtexception;
        r15 = $r14;
        goto label6;

     label24:
        $r16 := @caughtexception;
        r17 = $r16;
        goto label8;

     label25:
        $r18 := @caughtexception;
        r19 = $r18;
        goto label13;

     label26:
        $r20 := @caughtexception;
        r21 = $r20;
        goto label20;

     label27:
        $r22 := @caughtexception;
        r23 = $r22;
        goto label22;

     label28:
        $r24 := @caughtexception;
        r12 = $r24;
        goto label18;

     label29:
        $r25 := @caughtexception;
        r12 = $r25;
        i1 = i0;
        goto label18;

     label30:
        $r26 := @caughtexception;
        r27 = $r26;
        r6 = r3;
        r3 = r4;
        goto label11;

     label31:
        $r28 := @caughtexception;
        r29 = $r28;
        r3 = r4;
        goto label11;

        catch java.lang.Throwable from label0 to label1 with label10;
        catch java.lang.Throwable from label0 to label1 with label17;
        catch java.lang.Throwable from label2 to label3 with label30;
        catch java.lang.Throwable from label2 to label3 with label28;
        catch java.lang.Throwable from label3 to label4 with label31;
        catch java.lang.Throwable from label3 to label4 with label29;
        catch java.lang.Throwable from label5 to label6 with label23;
        catch java.lang.Throwable from label7 to label8 with label24;
        catch java.lang.Throwable from label12 to label13 with label25;
        catch java.lang.Throwable from label14 to label15 with label16;
        catch java.lang.Throwable from label19 to label20 with label26;
        catch java.lang.Throwable from label21 to label22 with label27;
    }

As you may see it, the first statement of label 19 in the second method
is illegally typed [r34 = (java.io.ObjectOutputStream) i1;] because integer
variable is cast to java.io.ObjectOutputStream.

I think the second statement of label 29 in the first method should be
[l5#2 = l4#2;],
not [l5#2 = l4;] and the reason why soot misinterpreted
this is the entry "catch java.lang.Throwable from label3 to label4
with label29;"
in the exception table is shadowed by
"catch java.lang.Throwable from label3 to label4 with label31;". Am I
guessing right?

Sorry for bothering you.

-- Heejong



On Thu, Oct 11, 2012 at 4:49 PM, Eric Bodden <eric.bodden at ec-spride.de> wrote:
> Hello.
>
>> Is the first exception table illegal?
>
> Stricktly speaking, to the best of my knowledge, it is not illegal, as
> it is covered by the JVM spec. Whether it makes sense is another
> questions.
>
>> What does "any" mean in the first table?
>
> I think it's a performance optimized version that has the same
> semantics as "Class java/lang/Throwable". Hence also the translation
> by Soot that you see...
>
>> Can I safely remove line 2, 4, 6 (the entry of type any) in the original table?
>
> Probably not. The semantics is that if more than one handlers match,
> as can be the case here, then the first will execute. Maybe your
> analysis should take that into account.
>
> Eric



-- 
Heejong Lee

Associate Research Engineer
Program Analysis Division
Fasoo.com, Inc. (www.spa-arrow.com)


More information about the Soot-list mailing list