1 import java.io.IOException;
2 class Blort {
arrayCopyTest(int k)3     private static void arrayCopyTest(int k) {
4         // A local variable assigned from an argument
5         int j = k;
6         // These two locals are defined once and used multiple times
7         String[] stringArray = new String[8];
8         Object[] objectArray = new Object[8];
9         // Should cause another move to be inserted
10         Object anotherOne = objectArray;
11 
12         if (anotherOne != null) {
13             System.out.println("foo");
14         }
15 
16         // "i" is used in a loop
17         for (int i = 0; i < stringArray.length; i++)
18             stringArray[i] = new String(Integer.toString(i));
19 
20         System.out.println("string -> object");
21         System.arraycopy(stringArray, 0, objectArray, 0, stringArray.length);
22         System.out.println("object -> string");
23         System.arraycopy(objectArray, 0, stringArray, 0, stringArray.length);
24         System.out.println("object -> string (modified)");
25         objectArray[4] = new Object();
26         try {
27             System.arraycopy(objectArray, 0, stringArray, 0,stringArray.length);
28         } catch (ArrayStoreException ase) {
29             // "ase" is an unused local which still must be preserved
30             System.out.println("caught ArrayStoreException (expected)");
31         }
32     }
33 
testConstructor()34     private void testConstructor() {
35         Blort foo = null;
36         try {
37             foo = new Blort();
38         } catch (Exception ex) {
39         }
40         System.err.println(foo);
41     }
42     /**
43      * Stolen from
44      * java/android/org/apache/http/impl/io/AbstractMessageParser.java
45      * Simplified.
46      *
47      * Checks to see that local variable assignment is preserved through
48      * phi's. The key component here is the assignment of previous = current.
49      */
parseHeaderGroup( final Object headGroup, final Object inbuffer, int maxHeaderCount, int maxLineLen)50     public static void parseHeaderGroup(
51             final Object headGroup,
52             final Object inbuffer,
53             int maxHeaderCount,
54             int maxLineLen)
55         throws  IOException {
56 
57         StringBuilder current = null;
58         StringBuilder previous = null;
59         for (;;) {
60             if (current == null) {
61                 current = new StringBuilder(64);
62             } else {
63                 current.length();
64             }
65             int l = inbuffer.hashCode();
66             if (l == -1 || current.length() < 1) {
67                 break;
68             }
69 
70             if ((current.charAt(0) == ' ' || current.charAt(0) == '\t') && previous != null) {
71                 int i = 0;
72                 while (i < current.length()) {
73                     char ch = current.charAt(i);
74                     if (ch != ' ' && ch != '\t') {
75                         break;
76                     }
77                     i++;
78                 }
79                 if (maxLineLen > 0
80                         && previous.length() + 1 + current.length() - i > maxLineLen) {
81                     throw new IOException("Maximum line length limit exceeded");
82                 }
83                 previous.append(' ');
84                 previous.append(current, i, current.length() - i);
85             } else {
86                 previous = current;
87                 current = null;
88             }
89             if (maxHeaderCount > 0) {
90                 throw new IOException("Maximum header count exceeded");
91             }
92         }
93     }
94 }
95