<div dir="ltr"><div>Hello Dr. Gambi,</div><div><br></div><div>I see one issue in this line:<br></div><div>$r0 := @caughtexception</div><div><br></div><div>This does not seem right since $r0 is of type com.orgzly.android.util.Encoding. This should actually be some sort of throwable.</div><div><br></div><div>Best regards,</div><div>Marc Miltenberger<br></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Am Mo., 22. März 2021 um 18:24 Uhr schrieb Alessio Gambi <<a href="mailto:alessio.gambi@uni-passau.de">alessio.gambi@uni-passau.de</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="overflow-wrap: break-word;">Dear All,<div><br></div><div>I am facing a weird problem while instrumenting a Kotlin data class using soot [1].</div><div><br></div><div>The problem is that after instrumenting the class, the byte code verifier rejects the class.</div><div><br></div><div>The method causing this seems to be “copy” that contains those units:</div><div><br></div><div><div>r0 := @this: com.orgzly.android.util.Encoding</div><div>$r1 := @parameter0: java.lang.String</div><div>$r2 := @parameter1: java.lang.String</div><div>$r3 := @parameter2: java.lang.String</div><div>staticinvoke <kotlin.jvm.internal.Intrinsics: void checkNotNullParameter(java.lang.Object,java.lang.String)>($r1, "used")</div><div>r0 = new com.orgzly.android.util.Encoding</div><div>specialinvoke r0.<com.orgzly.android.util.Encoding: void <init>(java.lang.String,java.lang.String,java.lang.String)>($r1, $r2, $r3)</div><div>return r0</div></div><div><br></div><div>The same method after the instrumentation looks like the one reported below (I simplified it), where the units marked with ** are the code injected via soot.</div><div><br></div><div>The instrumentations </div><div><span style="white-space:pre-wrap"> </span>- encapsulates all the parameters of method calls into generic arrays of objects</div><div><span style="white-space:pre-wrap"> </span>- invokes a Monitor class to track method invocations (before/after) and captures return values</div><div><span style="white-space:pre-wrap"> </span>- wraps the method with a generic try-catch-all where the catch block logs the captured exception before rethrowing it</div><div><br></div><div>Now the weirdness (IMHO) is that r0 is assigned first to @this and then to something different (<span style="color:rgb(0,0,0)">r0 = new com.orgzly.android.util.Encoding).</span></div><div><font color="#000000">This is part of the original code (see above), but I am afraid it might break the instrumented code because we pass r0 as parameter to other invocations in the catch block,</font></div><div><font color="#000000">under the assumption it points to “this”, </font><span style="color:rgb(0,0,0)">while in reality it points to another instance of the same type.</span></div><div><font color="#000000">Consequently, </font><font color="#000000">the </font><span style="color:rgb(0,0,0)">bytecode verifier reports the first call using it </span><span style="color:rgb(0,0,0)"> in the catch block </span><span style="color:rgb(0,0,0)">(</span><span style="color:rgb(0,0,0)">staticinvoke <Monitor: void onAppMethodCaptureException</span><span style="color:rgb(0,0,0)">) as invalid (with </span><span style="color:rgb(0,0,0)">type conflict)</span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div><span style="color:rgb(0,0,0)">Maybe someone has experiences something similar and/or can suggest a work around? Assuming this is indeed the problem, the only option I see at the moment</span></div><div><span style="color:rgb(0,0,0)"> is to assign the return of </span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,0)">r0 = new com.orgzly.android.util.Encoding to a fresh local variable (rX)</span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div><span style="color:rgb(0,0,0)">Any help is appreciated !</span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div><span style="color:rgb(0,0,0)">Best</span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div><font color="#000000"><span>— Dr. Alessio Gambi</span></font></div><div><font color="#000000"><span>Chair for SE 2</span></font></div><div><font color="#000000"><span>University of Passau</span></font></div><div><br></div><div><br></div><div>—————</div><div><span style="color:rgb(0,0,0)">[1] </span><a href="https://github.com/orgzly/orgzly-android/blob/master/app/src/main/java/com/orgzly/android/util/Encoding.kt" target="_blank">https://github.com/orgzly/orgzly-android/blob/master/app/src/main/java/com/orgzly/android/util/Encoding.kt</a></div><div><br></div><div><div>INSTRUMENTED CODE:</div><div> r0 := @this: com.orgzly.android.util.Encoding</div><div> $r1 := @parameter0: java.lang.String</div><div> $r2 := @parameter1: java.lang.String</div><div> $r3 := @parameter2: java.lang.String</div><div>** $r5 = newarray (java.lang.Object)[3]</div><div>** $r5[0] = $r1</div><div>** $r5[1] = $r2</div><div>** $r5[2] = $r3</div><div>** staticinvoke <Monitor: void onAppMethodCall(java.lang.String,java.lang.Object,java.lang.String,java.lang.Object[])>("com.orgzly", r0, "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", $r5)</div><div>** $r6 = newarray (java.lang.Object)[2]</div><div>** $r6[0] = $r1</div><div>** $r6[1] = "used"</div><div>** staticinvoke <Monitor: void onLibMethodCall(java.lang.Object,java.lang.String,java.lang.String,java.lang.Object[])>(null, "<kotlin.jvm.internal.Intrinsics: void checkNotNullParameter(java.lang.Object,java.lang.String)>", "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", $r6)</div><div> staticinvoke <kotlin.jvm.internal.Intrinsics: void checkNotNullParameter(java.lang.Object,java.lang.String)>($r1, "used")</div><div>** staticinvoke <Monitor: void onLibMethodReturnNormally(java.lang.Object,java.lang.String,java.lang.String,java.lang.Object)>(null, "<kotlin.jvm.internal.Intrinsics: void checkNotNullParameter(java.lang.Object,java.lang.String)>", "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", null)</div><div><br></div><div> r0 = new com.orgzly.android.util.Encoding</div><div> specialinvoke r0.<com.orgzly.android.util.Encoding: void <init>(java.lang.String,java.lang.String,java.lang.String)>($r1, $r2, $r3)</div><div>** staticinvoke <Monitor: void onAppMethodReturnNormally(java.lang.Object,java.lang.String,java.lang.String,java.lang.Object)>(r0, "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", r0)</div><div> return r0</div><div><br></div><div>** $r0 := @caughtexception</div><div>** $r7 = $r0</div><div>** staticinvoke <Monitor: void onAppMethodCaptureException(java.lang.Object,java.lang.String,java.lang.String,java.lang.Object)>(r0, "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", $r0)</div><div>** $r4 = $r0</div><div>** staticinvoke <Monitor: void onAppMethodThrowException(java.lang.Object,java.lang.String,java.lang.String,java.lang.Object)>(r0, "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", $r4)</div><div>** staticinvoke <Monitor: void onAppMethodReturnExceptionally(java.lang.Object,java.lang.String,java.lang.String,java.lang.Object)>(r0, "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", "<com.orgzly.android.util.Encoding: com.orgzly.android.util.Encoding copy(java.lang.String,java.lang.String,java.lang.String)>", $r4)</div><div>** throw $r4</div></div><div><br></div><div><br></div></div>_______________________________________________<br>
Soot-list mailing list<br>
<a href="mailto:Soot-list@CS.McGill.CA" target="_blank">Soot-list@CS.McGill.CA</a><br>
<a href="https://mailman.CS.McGill.CA/mailman/listinfo/soot-list" rel="noreferrer" target="_blank">https://mailman.CS.McGill.CA/mailman/listinfo/soot-list</a><br>
</blockquote></div>