<p dir="ltr">I was trying to implement ball larus path profiling on the following java program using soot.<br></p>
<p dir="ltr">1        package test1;</p>
<p dir="ltr">2        public class Main {</p>
<p dir="ltr">3         public static void main(String args[]) {</p>
<p dir="ltr">4         int x = args[0].length();</p>
<p dir="ltr">5         try {</p>
<p dir="ltr">6         int b = x / 0;</p>
<p dir="ltr">7         System.err.println("Here");</p>
<p dir="ltr">8         System.err.println(b);</p>
<p dir="ltr">9         } catch (ArithmeticException e1) {</p>
<p dir="ltr">10         if (x < 5)</p>
<p dir="ltr">11         x++;</p>
<p dir="ltr">12         else</p>
<p dir="ltr">13         x--;</p>
<p dir="ltr">14         System.err.println("Exception: e1");</p>
<p dir="ltr">15         } catch (Exception e5) {</p>
<p dir="ltr">16         x += 10;</p>
<p dir="ltr">17         } finally {</p>
<p dir="ltr">18         System.err.println("Finally");</p>
<p dir="ltr">19         }</p>
<p dir="ltr">20         System.err.println(x);</p>
<p dir="ltr">21         return;</p>
<p dir="ltr">22         }</p>
<p dir="ltr">23        }<br></p>
<p dir="ltr">There is java.lang.ArithmeticException divide by zero on line 6. When I run the program without instrumentation through soot, the exception is thrown at line 6 and "Here" of line 7 is not printed. But when I run the instrumented code, than exception is thrown after line 7 ( print "Here" ). <br></p>
<p dir="ltr">javap -c output of uninstrumented class file<br></p>
<p dir="ltr"> 3: invokevirtual #2 // Method java/lang/String.length:()I</p>
<p dir="ltr"> 6: istore_1</p>
<p dir="ltr"> 7: iload_1</p>
<p dir="ltr"> 8: iconst_0</p>
<p dir="ltr"> 9: idiv</p>
<p dir="ltr"> 10: istore_2</p>
<p dir="ltr"> 11: getstatic #3 // Field java/lang/System.err:Ljava/io/PrintStream;</p>
<p dir="ltr"> 14: ldc #4 // String Here</p>
<p dir="ltr"> 16: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V<br></p>
<p dir="ltr">division is at line 9 and print "Here" at 16<br></p>
<p dir="ltr">javap -c output of instrumented class file<br></p>
<p dir="ltr"> 27: getstatic #47 // Field java/lang/System.err:Ljava/io/PrintStream;</p>
<p dir="ltr"> 30: ldc #23 // String Here</p>
<p dir="ltr"> 32: invokevirtual #17 // Method java/io/PrintStream.println:(Ljava/lang/String;)V</p>
<p dir="ltr"> 35: lload_3</p>
<p dir="ltr"> 36: ldc2_w #52 // long 15l</p>
<p dir="ltr"> 39: ladd</p>
<p dir="ltr"> 40: ldc2_w #52 // long 15l</p>
<p dir="ltr"> 43: ladd</p>
<p dir="ltr"> 44: lstore_3</p>
<p dir="ltr"> 45: getstatic #47 // Field java/lang/System.err:Ljava/io/PrintStream;</p>
<p dir="ltr"> 48: iload_0</p>
<p dir="ltr"> 49: iconst_0</p>
<p dir="ltr"> 50: idiv</p>
<p dir="ltr"> 51: invokevirtual #39 // Method java/io/PrintStream.println:(I)V</p>
<p dir="ltr">Here line 30 is print "Here" and line 50 is division. (Ignore the extra adds, they are for BL path profiling.)</p>
<p dir="ltr">I'm not doing any rearrangement of instructions during Transformation. Why is this happening?<br></p>
<p dir="ltr">#java version </p>
<p dir="ltr">java version "1.7.0_95"</p>
<p dir="ltr">OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-3)</p>
<p dir="ltr">OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)<br></p>
<p dir="ltr">#javac</p>
<p dir="ltr">javac 1.7.0_95<br></p>
<p dir="ltr">#soot</p>
<p dir="ltr">soot-nightly-05082016</p>