[Soot-list] duplicate subgraphs in CFG

hsadat at gmail.com hsadat at gmail.com
Thu Jan 22 17:09:10 EST 2009


Thanks Eric and Martin,

After running soot on the class files of the same method, I noticed  
that the CFG looks correct.
In fact, there are no exceptional edges from the finally-block nodes.  
I checked the Jimple code
and it's consistent with the CFG: there's no handler for the finally- 
block; so if an exception occurs,
it's propagated to the caller.

So, you are right. When byte code is used to generate Jimple, things  
seem to be correct.

--Hossein

P.S. I posted an annotated CFG that has not made it through to the  
mailing list because of its size. Let me know,
if you're interested to see it.



On 22-Jan-09, at 9:06 AM, Eric Bodden wrote:

> 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