| /* This test checks for two slightly different overflow scenarios in |
| * array allocation. |
| * |
| * The first is that the number of bytes needed for an array size |
| * overflows on a 32 bit machine. |
| * |
| * The second is that on a 64 machine, the number of bytes silently |
| * gets truncated, resulting in too small an object being |
| * allocated. */ |
| |
| class newarray_overflow |
| { |
| static boolean failed = false; |
| |
| static void int_check() |
| { |
| int[] x; |
| try |
| { |
| x = new int [1 << 30]; |
| } |
| catch (OutOfMemoryError e) |
| { |
| return; |
| } |
| /* If we really get away with it (64 bit machine), that's cool. */ |
| if (x == null) { |
| System.err.println ("int check: new returned null."); |
| failed = true; |
| return; |
| } |
| try |
| { |
| // Only check a few places so we don't thrash too badly. |
| for (int i = 0; i < x.length; i += (1 << 24)) |
| if (x[i] != 0) |
| failed = true; |
| } |
| catch (Throwable e) |
| { |
| System.err.print ("int check: "); |
| System.err.println (e); |
| failed = true; |
| } |
| } |
| |
| static void object_check() |
| { |
| Object[] x; |
| try |
| { |
| x = new Object [1 << 30]; |
| System.err.println ("Alloc succeeded."); |
| System.err.println (x); |
| } |
| catch (OutOfMemoryError e) |
| { |
| return; |
| } |
| /* If we really get away with it (64 bit machine), that's cool. */ |
| if (x == null) { |
| System.err.println ("Object check: new returned null."); |
| failed = true; |
| return; |
| } |
| try |
| { |
| for (int i = 0; i < x.length; i += (1 << 24)) |
| if (x[i] != null) |
| failed = true; |
| } |
| catch (Throwable e) |
| { |
| System.err.print ("Object check: "); |
| System.err.println (e); |
| failed = true; |
| } |
| } |
| |
| public static void main (String[] ignore) |
| { |
| int_check(); |
| object_check(); |
| |
| if (!failed) |
| System.out.println ("ok"); |
| } |
| } |