[Soot-list] incoherent stack height

Khilan Gudka khilan at doc.ic.ac.uk
Sun Jul 11 11:22:45 EDT 2010


Hi,

I apologise for the previous email. The example was too complicated. I
now have a much simpler example:

Exception in thread "main" java.lang.RuntimeException:
<test.StaticFieldLoad1: void main(java.lang.String[])>: incoherent
stack height at block merge point Block 1:
[preds: 0 2 ] [succs: 2 4 ]
nop;
push class "test/StaticFieldLoad1";
store.r _p1;
load.r _p1;
ifnull nop;
Block 2:
[preds: 1 ] [succs: 3 1 ]
load.r _p1;
push 1;
staticinvoke <MyClass: boolean m(java.lang.Object)>;
ifeq nop;

computed blockHeight == 1 recorded blockHeight = 0
	at soot.baf.JasminClass.calculateStackHeight(JasminClass.java:1845)
	at soot.baf.JasminClass.calculateStackHeight(JasminClass.java:1850)

The corresponding jimple code is:

     label0:
        nop;
        _p1 = class "test/StaticFieldLoad1";
        if _p1 == null goto label1;

        _locked1 = staticinvoke <MyClass: boolean m(java.lang.Object)>(_p1, 1);
        if _locked1 == 0 goto label0;

        nop;

     label1:
        nop;

One thing that I'm not sure about is the instruction "ifeq nop;"
Looking at the jimple, this corresponds to "if _locked1 == 0 goto
label0;" However, in the bytecode there is no instruction that pushes
0 onto the stack for the comparison (the only predecessor for block 2
is block 1 and block 1 doesn't have an instruction that pushes 0 onto
the stack). Am I missing something here?

Thanks,
Khilan

On 11 July 2010 15:27, Khilan Gudka <khilan at doc.ic.ac.uk> wrote:
> Hi,
>
> I'm instrumenting code but jasmin is throwing the following exception
> for one particular class:
>
>        Exception in thread "main" java.lang.RuntimeException:
> <org.hsqldb.jdbc.jdbcConnection: java.util.Map getTypeMap()>:
> incoherent stack height at block merge point Block 193:
>        [preds: 192 196 ] [succs: 194 197 ]
>                Block 196:
>        [preds: 194 195 ] [succs: 193 ]
>        inc.i $elem235 1;
>        goto load.i $elem235;
>
>        computed blockHeight == 18 recorded blockHeight = 17
>                at soot.baf.JasminClass.calculateStackHeight(JasminClass.java:1842)
>                at soot.baf.JasminClass.calculateStackHeight(JasminClass.java:1847)
>                ...
>
> The corresponding jimple code (i think) is:
>
>        $p213 = $c213.<java.util.HashMap:
> java.util.HashMap$HashEntry[] buckets>;
>        if $p213 == null goto label58;
>
>        $locked213 = staticinvoke <MyClass: boolean
> m(java.lang.Object)>($p213, 1);
>        if $locked213 == 0 goto label0;
>
>        $idx235 = 0;
>
>     label55:
>        $len235 = lengthof $p213;
>        if $idx235 >= $len235 goto label57;
>
>        $elem235 = $p213[$idx235];
>        if $elem235 == null goto label56;
>
>        $locked235 = staticinvoke < MyClass: boolean
> m(java.lang.Object)>($elem235, 1);
>        if $locked235 == 0 goto label0;
>
>     label56:
>        $idx235 = $idx235 + 1;
>        goto label55;
>
>     label57:
>        nop;
>
> However, I don't understand why $elem235 is being incremented and not
> $idx235 (as is being done in the jimple?). All the $ variables are
> local variables.
>
> Thanks,
> Khilan
>


More information about the Soot-list mailing list