|  | // Copyright 2015 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 | 
|  |  | 
|  | // The memory profiler can call copy from a slice on the system stack, | 
|  | // which msan used to think meant a reference to uninitialized memory. | 
|  |  | 
|  | /* | 
|  | #include <time.h> | 
|  | #include <unistd.h> | 
|  |  | 
|  | extern void Nop(char*); | 
|  |  | 
|  | // Use weak as a hack to permit defining a function even though we use export. | 
|  | void poison() __attribute__ ((weak)); | 
|  |  | 
|  | // Poison the stack. | 
|  | void poison() { | 
|  | char a[1024]; | 
|  | Nop(&a[0]); | 
|  | } | 
|  |  | 
|  | */ | 
|  | import "C" | 
|  |  | 
|  | import ( | 
|  | "runtime" | 
|  | ) | 
|  |  | 
|  | func main() { | 
|  | runtime.MemProfileRate = 1 | 
|  | start(100) | 
|  | } | 
|  |  | 
|  | func start(i int) { | 
|  | if i == 0 { | 
|  | return | 
|  | } | 
|  | C.poison() | 
|  | // Tie up a thread. | 
|  | // We won't actually wait for this sleep to complete. | 
|  | go func() { C.sleep(1) }() | 
|  | start(i - 1) | 
|  | } | 
|  |  | 
|  | //export Nop | 
|  | func Nop(*C.char) { | 
|  | } |