[Soot-list] duplicate subgraphs in CFG
Eric Bodden
eric.bodden at mail.mcgill.ca
Thu Jan 22 11:06:14 EST 2009
Thanks Martin.
Indeed I suspect an error in the Java2Jimple frontend that Soot uses.
When you process bytecode with Soot then this frontend is not being
used.
Eric
2009/1/22 Martin Bravenboer <martin.bravenboer at gmail.com>:
> Hi Hossein & Eric,
>
> I'm not using the Soot Eclipse plugin, so I don't know if this code is
> compiled by the Eclipse compiler or one of the Soot front-ends?
>
> Anyway, it seems an issue specific to one of these compilers. If you
> compile the code with javac, and use Soot to produce Jimple, then you
> get this:
>
> ---------------------------------------------------------------------
> public static void main(java.lang.String[])
> {
> java.lang.String[] r0;
> java.io.PrintWriter r1, $r4;
> java.io.IOException r2, $r5;
> java.lang.Throwable r3, $r8;
> java.io.PrintStream $r6;
> java.lang.String $r7;
>
> r0 := @parameter0: java.lang.String[];
> r1 = null;
>
> label0:
> $r4 = new java.io.PrintWriter;
> specialinvoke $r4.<java.io.PrintWriter: void
> <init>(java.lang.String)>("out.txt");
> r1 = $r4;
> virtualinvoke r1.<java.io.PrintWriter: void
> println(java.lang.String)>("something");
>
> label1:
> if r1 == null goto label9;
>
> virtualinvoke r1.<java.io.PrintWriter: void close()>();
> goto label9;
>
> label2:
> $r5 := @caughtexception;
>
> label3:
> r2 = $r5;
> $r6 = <java.lang.System: java.io.PrintStream out>;
> $r7 = virtualinvoke r2.<java.io.IOException: java.lang.String
> getMessage()>();
> virtualinvoke $r6.<java.io.PrintStream: void
> println(java.lang.String)>($r7);
>
> label4:
> if r1 == null goto label9;
>
> virtualinvoke r1.<java.io.PrintWriter: void close()>();
> goto label9;
>
> label5:
> $r8 := @caughtexception;
>
> label6:
> r3 = $r8;
>
> label7:
> if r1 == null goto label8;
>
> virtualinvoke r1.<java.io.PrintWriter: void close()>();
>
> label8:
> throw r3;
>
> label9:
> return;
>
> catch java.io.IOException from label0 to label1 with label2;
> catch java.lang.Throwable from label0 to label1 with label5;
> catch java.lang.Throwable from label3 to label4 with label5;
> catch java.lang.Throwable from label6 to label7 with label5;
> }
> }
> ---------------------------------------------------------------------
>
> This is correct:
>
> label0: try code
> label1: finally code for successful try
> label2: exception handler for try (IOException)
> label3: catch code
> label4: finally code for successful catch
> label5: exception handler for try (all Throwable not IOException)
> and any throwable in catch
> label7: finally code for failure in try or failure in catch
>
> The handlers:
>
> catch java.io.IOException from label0 to label1 with label2;
>
> IOException in try code -> goto catch
>
> catch java.lang.Throwable from label0 to label1 with label5;
>
> Throwable in try code -> goto finally
>
> catch java.lang.Throwable from label3 to label4 with label5;
>
> Throwable in catch code -> goto finally
>
> catch java.lang.Throwable from label6 to label7 with label5;
>
> This exception handler is always generated by javac and seems to
> handle corner cases. It covers astore_2 only, which can only throw
> asynchronous exceptions (the instructions itself doesn't throw
> anything). It retries the finally clause if an exception occurs.
>
> Cheers,
> --
> Martin Bravenboer
> ---------------------------------------------------------------------
> Department of Computer Science
> University of Massachusetts Amherst
>
--
Eric Bodden
Sable Research Group, McGill University
Montréal, Québec, Canada
More information about the Soot-list
mailing list