Instrumentation failure, Resolved Field is Null
amordahl opened this issue · comments
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)
Thank you for submitting the issue.
Can you please attach the jar file and the command you used to run the slicer?
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 "
Hi Khaled, just following up on this issue. Let me know if there's anything else you need. Thanks!
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