[Soot-list] Error in Android validation/custom validation?
Julian Schütte
julian.schuette at gmx.net
Tue Feb 11 11:16:21 EST 2014
Hello all,
when parsing an (slightly obfuscated) Android app, I bumped into the
following Exception if Options.v().set_validate(true) is set. My
impression is that there is a bug in soot.toolkits.scalar.InitAnalysis,
but I might be wrong here. If this is the expected behavior, is there
any way to register a custom validation?
Exception in thread "main" java.lang.RuntimeException: Warning: Local
variable $r3 not definitely defined at exitmonitor $r3 in
<org.example.myapp.c: void a(org.example.myapp.b)>
at soot.Body.checkInit(Body.java:787)
at soot.Body.validate(Body.java:237)
at soot.jimple.JimpleBody.validate(JimpleBody.java:72)
at soot.PackManager.runBodyPacks(PackManager.java:900)
at soot.PackManager.runBodyPacks(PackManager.java:584)
at soot.PackManager.runBodyPacks(PackManager.java:487)
at soot.PackManager.runPacksNormally(PackManager.java:464)
at soot.PackManager.runPacks(PackManager.java:388)
at de.linkality.test.Main.main(Main.java:105)
The following Jimple code is responsible for the Exception. It passes
the Dex verifier and executes nicely, but fails Soot's validation.
public void a(org.example.myapp.b)
{
org.example.myapp.c $r0;
org.example.myapp.b $r1;
java.util.ArrayList $r2;
java.lang.Object $r3;
boolean $z0;
java.lang.Throwable $r4;
java.util.List $r5;
$r0 := @this: org.example.myapp.c;
$r1 := @parameter0: org.example.myapp.b;
$r2 = $r0.<org.example.myapp.c: java.util.ArrayList h>;
if $r2 == null goto label5;
$r3 = $r0.<org.example.myapp.c: java.lang.Object b>;
entermonitor $r3;
label0:
$r2 = $r0.<org.example.myapp.c: java.util.ArrayList h>;
virtualinvoke $r2.<java.util.ArrayList: boolean
add(java.lang.Object)>($r1);
$z0 = $r0.<org.example.myapp.c: boolean f>;
if $z0 == 0 goto label1;
virtualinvoke $r0.<org.example.myapp.c: void
notifyDataSetChanged()>();
label1:
exitmonitor $r3; // <-- NO PROBLEM HERE
label2:
return;
label3:
$r4 := @caughtexception;
exitmonitor $r3; // <-- ************ EXCEPTION OCCURS HERE.
InitAnalysis.getFlowBefore() is {$r0, $r1, $r2} ********
label4:
throw $r4;
label5:
$r5 = $r0.<org.example.myapp.c: java.util.List a>;
interfaceinvoke $r5.<java.util.List: boolean
add(java.lang.Object)>($r1);
$z0 = $r0.<org.example.myapp.c: boolean f>;
if $z0 == 0 goto label2;
virtualinvoke $r0.<org.example.myapp.c: void
notifyDataSetChanged()>();
goto label2;
catch java.lang.Throwable from label0 to label4 with label3;
}
Best regards,
Julian
More information about the Soot-list
mailing list