mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 00:30:57 +00:00 
			
		
		
		
	
		
			
	
	
		
			33 lines
		
	
	
	
		
			1,014 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			33 lines
		
	
	
	
		
			1,014 B
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | // $G $D/$F.go && $L $F.$A && (! ./$A.out || echo BUG: should fail) | ||
|  | 
 | ||
|  | // Copyright 2009 The Go Authors. All rights reserved. | ||
|  | // Use of this source code is governed by a BSD-style | ||
|  | // license that can be found in the LICENSE file. | ||
|  | 
 | ||
|  | package main | ||
|  | 
 | ||
|  | import "unsafe" | ||
|  | 
 | ||
|  | var dummy [512<<20]byte;	// give us a big address space | ||
|  | func main() { | ||
|  | 	// the test only tests what we intend to test | ||
|  | 	// if dummy starts in the first 256 MB of memory. | ||
|  | 	// otherwise there might not be anything mapped | ||
|  | 	// at the address that might be accidentally | ||
|  | 	// dereferenced below. | ||
|  | 	if uintptr(unsafe.Pointer(&dummy)) > 256<<20 { | ||
|  | 		panic("dummy too far out"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// The problem here is that indexing into p[] with a large | ||
|  | 	// enough index can jump out of the unmapped section | ||
|  | 	// at the beginning of memory and into valid memory. | ||
|  | 	// | ||
|  | 	// To avoid needing a check on every slice beyond the | ||
|  | 	// usual len and cap, we require the *array -> slice | ||
|  | 	// conversion to do the check. | ||
|  | 	var p *[1<<30]byte = nil; | ||
|  | 	var x []byte = p;	// should crash | ||
|  | 	_ = x; | ||
|  | } |