vranganath> I am using soot 2.1.0 and I get the following vranganath> exception when retrieving the body for the vranganath> attached class. I used jikes to compile the vranganath> attached source. This turned out to be a simple off-by-one error that caused the part of Soot which initially turns bytecode into jimple to ignore the last non-default choice in a tableswitch when it fixes up references to inlined jsr subroutines. I've checked the fix into the development version of Soot. I'll append a one-line (really one-character) patch to fix the problem in soot 2.1.0. Just in case anybody at Sable lab ever wants to maintain a collection of regression tests for fixed bugs, I'm also attaching a very simple class file that triggers the bug, along with the Java source from which jikes 1.18 produced the class file.
--- src/soot/coffi/CFG.java 2004-08-14 09:13:04.000000000 -0600 +++ /tmp/CFG.java 2004-08-14 09:13:34.000000000 -0600 @@ -924,7 +924,7 @@ newdefault.labelled = true; } - for (int i=0; i<switchinsn.high-switchinsn.low; i++) + for (int i=0; i<=switchinsn.high-switchinsn.low; i++) { Instruction newtgt = (Instruction)replacedInsns.get(switchinsn.jump_insts[i]);
// Attempt to produce a simple test case that triggers the bug // reported by Venkatesh Prasad Ranganath to soot-list on 9 August 2004. // // For this code to trigger the bug, it must be compiled by jikes (so that // the switch is implemented with a tableswitch), rather // than javac (which would use a lookupswitch). class TableswitchBug { private static int excuseForFinally = 0; public static void bugTickler(int d) { excuseForFinally = 1; try { switch (d) { case 7: return; } } finally { excuseForFinally = 0; } } }
Attachment:
TableswitchBug.class
Description: Class that triggers Soot-2.1.0's tableswitch to jsr bug