Source file src/cmd/cgo/internal/testsanitizers/testdata/msan4.go

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  // The memory profiler can call copy from a slice on the system stack,
     8  // which msan used to think meant a reference to uninitialized memory.
     9  
    10  /*
    11  #include <time.h>
    12  #include <unistd.h>
    13  
    14  extern void Nop(char*);
    15  
    16  // Use weak as a hack to permit defining a function even though we use export.
    17  void poison() __attribute__ ((weak));
    18  
    19  // Poison the stack.
    20  void poison() {
    21  	char a[1024];
    22  	Nop(&a[0]);
    23  }
    24  
    25  */
    26  import "C"
    27  
    28  import (
    29  	"runtime"
    30  )
    31  
    32  func main() {
    33  	runtime.MemProfileRate = 1
    34  	start(100)
    35  }
    36  
    37  func start(i int) {
    38  	if i == 0 {
    39  		return
    40  	}
    41  	C.poison()
    42  	// Tie up a thread.
    43  	// We won't actually wait for this sleep to complete.
    44  	go func() { C.sleep(1) }()
    45  	start(i - 1)
    46  }
    47  
    48  //export Nop
    49  func Nop(*C.char) {
    50  }
    51  

View as plain text