github.com/MangoDowner/go-gm@v0.0.0-20180818020936-8baa2bd4408c/misc/cgo/testsanitizers/msan2.go (about)

     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  /*
     8  #include <string.h>
     9  #include <stdint.h>
    10  #include <stdlib.h>
    11  
    12  void f(int32_t *p, int n) {
    13    int32_t * volatile q = (int32_t *)malloc(sizeof(int32_t) * n);
    14    memcpy(p, q, n * sizeof(*p));
    15    free(q);
    16  }
    17  
    18  void g(int32_t *p, int n) {
    19    if (p[4] != 1) {
    20      abort();
    21    }
    22  }
    23  */
    24  import "C"
    25  
    26  import (
    27  	"unsafe"
    28  )
    29  
    30  func main() {
    31  	a := make([]int32, 10)
    32  	C.f((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
    33  	a[4] = 1
    34  	C.g((*C.int32_t)(unsafe.Pointer(&a[0])), C.int(len(a)))
    35  }