mirror of
				https://github.com/golang/go.git
				synced 2025-11-04 02:30:57 +00:00 
			
		
		
		
	
		
			
	
	
		
			32 lines
		
	
	
	
		
			757 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			32 lines
		
	
	
	
		
			757 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// errorcheck -0 -m -l
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Copyright 2017 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 foo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Escape analysis needs to treat the uintptr-typed reflect.*Header fields as pointers.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"reflect"
							 | 
						||
| 
								 | 
							
									"unsafe"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type immutableBytes []byte
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Bug was failure to leak param b.
							 | 
						||
| 
								 | 
							
								func toString(b immutableBytes) string { // ERROR "leaking param: b$"
							 | 
						||
| 
								 | 
							
									var s string
							 | 
						||
| 
								 | 
							
									if len(b) == 0 {
							 | 
						||
| 
								 | 
							
										return s
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									strHeader := (*reflect.StringHeader)(unsafe.Pointer(&s))         // ERROR "toString &s does not escape$"
							 | 
						||
| 
								 | 
							
									strHeader.Data = (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data // ERROR "toString &b does not escape$"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									l := len(b)
							 | 
						||
| 
								 | 
							
									strHeader.Len = l
							 | 
						||
| 
								 | 
							
									return s
							 | 
						||
| 
								 | 
							
								}
							 |