mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			89 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Java
		
	
	
	
/* 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");
 | 
						|
  }
 | 
						|
}
 |