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");
 | |
|   }
 | |
| }
 |