|  | // 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() | 
|  | } |