resess / Slicer4J

Slicer4J is an accurate, low-overhead dynamic slicer for Java programs.
MIT License
39 stars 17 forks source link

Instrumentation failure, Resolved Field is Null #19

Open amordahl opened 2 years ago

amordahl commented 2 years ago

When trying to run Slicer4J through the python script, the instrumentation fails. I am using JDK 9, on Mac OS. Here is the content of instr-debug.log.

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/austin/git/Slicer4J/Slicer4J/target/slicer4j-jar-with-dependencies.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/austin/git/Slicer4J/Slicer4J/target/lib/soot-infoflow-2.9.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/austin/git/Slicer4J/Slicer4J/target/lib/slf4j-simple-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
[main] INFO JimpleWriter - initialize (17): Initializing Instrumenter
[main] INFO JimpleWriter - initialize (30): Initialization done
[main] INFO JimpleWriter - start (37): Running packs ... 
[main] INFO JimpleWriter - start (39): Writing output ... 
[main] INFO JimpleWriter - start (41): Output written ... 
[main] INFO JavaInstrumenter - initialize (79): Initializing Instrumenter
[main] INFO JavaInstrumenter - initialize (98): Initialization done
[main] INFO JavaInstrumenter - start (252): Running packs ... 
[Thread-31] INFO InstrumenterUtils - addPrint (456): Statement: $stack6 = string.<java.lang.String: char[] value>
[Thread-31] ERROR heros.solver.CountingThreadPoolExecutor - Worker thread execution failed: Resolved field is null: string.<java.lang.String: char[] value>
Resolved field is null: string.<java.lang.String: char[] value>
in unit: $stack6 = string.<java.lang.String: char[] value>
in body: 
     public static boolean regionMatches(java.lang.String, int, java.lang.String, int, int)
    {
        int start, $stack7, length, $stack8, thisStart, $stack10, $stack11, $stack12, $stack14, i, $i0, $i1, hashCode;
        java.lang.String string, thisStr, tmpString, tmpString;
        char $stack16, $stack17;
        char[] $stack6, $stack9, $stack13, $stack15;
        java.lang.StringBuilder sb, sb;
        java.lang.Object tmpField;

        thisStr := @parameter0: java.lang.String;

        thisStart := @parameter1: int;

        string := @parameter2: java.lang.String;

        start := @parameter3: int;

        length := @parameter4: int;

        sb = new java.lang.StringBuilder;

        specialinvoke sb.<java.lang.StringBuilder: void <init>()>();

        hashCode = staticinvoke <java.lang.System: int identityHashCode(java.lang.Object)>(string);

        virtualinvoke sb.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>("814193");

        tmpString = virtualinvoke sb.<java.lang.StringBuilder: java.lang.String toString()>();

        staticinvoke <DynamicSlicingLogger: void println(java.lang.String,int)>(tmpString, hashCode);

        $stack6 = string.<java.lang.String: char[] value>;

        $stack7 = lengthof $stack6;

        $stack8 = $stack7 - start;

        if $stack8 < length goto label1;

        if start >= 0 goto label2;

     label1:
        return 0;

     label2:
        if thisStart < 0 goto label3;

        $stack9 = thisStr.<java.lang.String: char[] value>;

        $stack10 = lengthof $stack9;

        $stack11 = $stack10 - thisStart;

        if $stack11 >= length goto label4;

     label3:
        return 0;

     label4:
        if length > 0 goto label5;

        return 1;

     label5:
        i = 0;

     label6:
        if i >= length goto label8;

        $stack13 = thisStr.<java.lang.String: char[] value>;

        $stack12 = thisStart + i;

        $stack17 = $stack13[$stack12];

        $stack15 = string.<java.lang.String: char[] value>;

        $stack14 = start + i;

        $stack16 = $stack15[$stack14];

        $i0 = (int) $stack17;

        $i1 = (int) $stack16;

        if $i0 == $i1 goto label7;

        return 0;

     label7:
        i = i + 1;

        goto label6;

     label8:
        return 1;
    }

    at soot.jimple.validation.FieldRefValidator.validate(FieldRefValidator.java:83)
    at soot.jimple.JimpleBody.validate(JimpleBody.java:124)
    at soot.jimple.JimpleBody.validate(JimpleBody.java:106)
    at ca.ubc.ece.resess.slicer.dynamic.core.instrumenter.InstrumenterUtils.addPrint(InstrumenterUtils.java:454)
    at ca.ubc.ece.resess.slicer.dynamic.core.instrumenter.InstrumenterUtils.basicBlockInstrument(InstrumenterUtils.java:70)
    at ca.ubc.ece.resess.slicer.dynamic.slicer4j.instrumenter.JavaInstrumenter$2.internalTransform(JavaInstrumenter.java:183)
    at soot.BodyTransformer.transform(BodyTransformer.java:47)
    at soot.Transform.apply(Transform.java:126)
    at soot.BodyPack.internalApply(BodyPack.java:49)
    at soot.Pack.apply(Pack.java:126)
    at soot.PackManager.runBodyPacks(PackManager.java:991)
    at soot.PackManager.lambda$runBodyPacks$0(PackManager.java:667)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.base/java.lang.Thread.run(Thread.java:844)
Exception in thread "main" Resolved field is null: string.<java.lang.String: char[] value>
in unit: $stack6 = string.<java.lang.String: char[] value>
in body: 
     public static boolean regionMatches(java.lang.String, int, java.lang.String, int, int)
    {
        int start, $stack7, length, $stack8, thisStart, $stack10, $stack11, $stack12, $stack14, i, $i0, $i1, hashCode;
        java.lang.String string, thisStr, tmpString, tmpString;
        char $stack16, $stack17;
        char[] $stack6, $stack9, $stack13, $stack15;
        java.lang.StringBuilder sb, sb;
        java.lang.Object tmpField;

        thisStr := @parameter0: java.lang.String;

        thisStart := @parameter1: int;

        string := @parameter2: java.lang.String;

        start := @parameter3: int;

        length := @parameter4: int;

        sb = new java.lang.StringBuilder;

        specialinvoke sb.<java.lang.StringBuilder: void <init>()>();

        hashCode = staticinvoke <java.lang.System: int identityHashCode(java.lang.Object)>(string);

        virtualinvoke sb.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>("814193");

        tmpString = virtualinvoke sb.<java.lang.StringBuilder: java.lang.String toString()>();

        staticinvoke <DynamicSlicingLogger: void println(java.lang.String,int)>(tmpString, hashCode);

        $stack6 = string.<java.lang.String: char[] value>;

        $stack7 = lengthof $stack6;

        $stack8 = $stack7 - start;

        if $stack8 < length goto label1;

        if start >= 0 goto label2;

     label1:
        return 0;

     label2:
        if thisStart < 0 goto label3;

        $stack9 = thisStr.<java.lang.String: char[] value>;

        $stack10 = lengthof $stack9;

        $stack11 = $stack10 - thisStart;

        if $stack11 >= length goto label4;

     label3:
        return 0;

     label4:
        if length > 0 goto label5;

        return 1;

     label5:
        i = 0;

     label6:
        if i >= length goto label8;

        $stack13 = thisStr.<java.lang.String: char[] value>;

        $stack12 = thisStart + i;

        $stack17 = $stack13[$stack12];

        $stack15 = string.<java.lang.String: char[] value>;

        $stack14 = start + i;

        $stack16 = $stack15[$stack14];

        $i0 = (int) $stack17;

        $i1 = (int) $stack16;

        if $i0 == $i1 goto label7;

        return 0;

     label7:
        i = i + 1;

        goto label6;

     label8:
        return 1;
    }

    at soot.jimple.validation.FieldRefValidator.validate(FieldRefValidator.java:83)
    at soot.jimple.JimpleBody.validate(JimpleBody.java:124)
    at soot.jimple.JimpleBody.validate(JimpleBody.java:106)
    at ca.ubc.ece.resess.slicer.dynamic.core.instrumenter.InstrumenterUtils.addPrint(InstrumenterUtils.java:454)
    at ca.ubc.ece.resess.slicer.dynamic.core.instrumenter.InstrumenterUtils.basicBlockInstrument(InstrumenterUtils.java:70)
    at ca.ubc.ece.resess.slicer.dynamic.slicer4j.instrumenter.JavaInstrumenter$2.internalTransform(JavaInstrumenter.java:183)
    at soot.BodyTransformer.transform(BodyTransformer.java:47)
    at soot.Transform.apply(Transform.java:126)
    at soot.BodyPack.internalApply(BodyPack.java:49)
    at soot.Pack.apply(Pack.java:126)
    at soot.PackManager.runBodyPacks(PackManager.java:991)
    at soot.PackManager.lambda$runBodyPacks$0(PackManager.java:667)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.base/java.lang.Thread.run(Thread.java:844)
Exception in thread "Thread-31" Resolved field is null: string.<java.lang.String: char[] value>
in unit: $stack6 = string.<java.lang.String: char[] value>
in body: 
     public static boolean regionMatches(java.lang.String, int, java.lang.String, int, int)
    {
        int start, $stack7, length, $stack8, thisStart, $stack10, $stack11, $stack12, $stack14, i, $i0, $i1, hashCode;
        java.lang.String string, thisStr, tmpString, tmpString;
        char $stack16, $stack17;
        char[] $stack6, $stack9, $stack13, $stack15;
        java.lang.StringBuilder sb, sb;
        java.lang.Object tmpField;

        thisStr := @parameter0: java.lang.String;

        thisStart := @parameter1: int;

        string := @parameter2: java.lang.String;

        start := @parameter3: int;

        length := @parameter4: int;

        sb = new java.lang.StringBuilder;

        specialinvoke sb.<java.lang.StringBuilder: void <init>()>();

        hashCode = staticinvoke <java.lang.System: int identityHashCode(java.lang.Object)>(string);

        virtualinvoke sb.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>("814193");

        tmpString = virtualinvoke sb.<java.lang.StringBuilder: java.lang.String toString()>();

        staticinvoke <DynamicSlicingLogger: void println(java.lang.String,int)>(tmpString, hashCode);

        $stack6 = string.<java.lang.String: char[] value>;

        $stack7 = lengthof $stack6;

        $stack8 = $stack7 - start;

        if $stack8 < length goto label1;

        if start >= 0 goto label2;

     label1:
        return 0;

     label2:
        if thisStart < 0 goto label3;

        $stack9 = thisStr.<java.lang.String: char[] value>;

        $stack10 = lengthof $stack9;

        $stack11 = $stack10 - thisStart;

        if $stack11 >= length goto label4;

     label3:
        return 0;

     label4:
        if length > 0 goto label5;

        return 1;

     label5:
        i = 0;

     label6:
        if i >= length goto label8;

        $stack13 = thisStr.<java.lang.String: char[] value>;

        $stack12 = thisStart + i;

        $stack17 = $stack13[$stack12];

        $stack15 = string.<java.lang.String: char[] value>;

        $stack14 = start + i;

        $stack16 = $stack15[$stack14];

        $i0 = (int) $stack17;

        $i1 = (int) $stack16;

        if $i0 == $i1 goto label7;

        return 0;

     label7:
        i = i + 1;

        goto label6;

     label8:
        return 1;
    }

    at soot.jimple.validation.FieldRefValidator.validate(FieldRefValidator.java:83)
    at soot.jimple.JimpleBody.validate(JimpleBody.java:124)
    at soot.jimple.JimpleBody.validate(JimpleBody.java:106)
    at ca.ubc.ece.resess.slicer.dynamic.core.instrumenter.InstrumenterUtils.addPrint(InstrumenterUtils.java:454)
    at ca.ubc.ece.resess.slicer.dynamic.core.instrumenter.InstrumenterUtils.basicBlockInstrument(InstrumenterUtils.java:70)
    at ca.ubc.ece.resess.slicer.dynamic.slicer4j.instrumenter.JavaInstrumenter$2.internalTransform(JavaInstrumenter.java:183)
    at soot.BodyTransformer.transform(BodyTransformer.java:47)
    at soot.Transform.apply(Transform.java:126)
    at soot.BodyPack.internalApply(BodyPack.java:49)
    at soot.Pack.apply(Pack.java:126)
    at soot.PackManager.runBodyPacks(PackManager.java:991)
    at soot.PackManager.lambda$runBodyPacks$0(PackManager.java:667)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.base/java.lang.Thread.run(Thread.java:844)
khaled-e-a commented 2 years ago

Thank you for submitting the issue. Can you please attach the jar file and the command you used to run the slicer?

amordahl commented 2 years ago

Sure. I am trying to run Slicer4J on FlowDroid; I've attached the jar. The command I used to run is

python slicer4j.py -j ~/git/FlowDroid/soot-infoflow-cmd/target/soot-infoflow-cmd-jar-with-dependencies.jar -b soot/jimple/infoflow/Infoflow:711 -o ~/test -m "soot/jimple/infoflow/cmd/MainClass -a ~/Downloads/DroidBench30/benchmark/apks/Aliasing/FlowSensitivity1.apk -p ~/Library/Android/sdk/platforms -s ~/git/FlowDroid/soot-infoflow-android/SourcesAndSinks.txt "

soot-infoflow-cmd-jar-with-dependencies.jar.zip

amordahl commented 2 years ago

Hi Khaled, just following up on this issue. Let me know if there's anything else you need. Thanks!

khaled-e-a commented 2 years ago

Hi @amordahl , I am still working on this, I am facing a different issue [Thread-40] ERROR heros.solver.CountingThreadPoolExecutor - Worker thread execution failed: 1 java.lang.ArrayIndexOutOfBoundsException: 1 at org.objectweb.asm.MethodWriter.visitParameterAnnotation(MethodWriter.java:697)

I am currently working on it, but have other projects to work on so the progress maybe slow. May I know are you able to slice other programs? is your work blocked by this issue? Thank you for your patience