// Copyright 2016 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 // Using reflect to set a value was not seen by msan. /* #include <stdlib.h> extern void Go1(int*); extern void Go2(char*); // Use weak as a hack to permit defining a function even though we use export. void C1() __attribute__ ((weak)); void C2() __attribute__ ((weak)); void C1() { int i; Go1(&i); if (i != 42) { abort(); } } void C2() { char a[2]; a[1] = 42; Go2(a); if (a[0] != 42) { abort(); } } */ import "C" import ( "reflect" "unsafe" ) //export Go1 func Go1(p *C.int) { reflect.ValueOf(p).Elem().Set(reflect.ValueOf(C.int(42))) } //export Go2 func Go2(p *C.char) { a := (*[2]byte)(unsafe.Pointer(p)) reflect.Copy(reflect.ValueOf(a[:1]), reflect.ValueOf(a[1:])) } func main() { C.C1() C.C2() }