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// +build msan 6 7package runtime 8 9import ( 10 "unsafe" 11) 12 13// Public memory sanitizer API. 14 15func MSanRead(addr unsafe.Pointer, len int) { 16 msanread(addr, uintptr(len)) 17} 18 19func MSanWrite(addr unsafe.Pointer, len int) { 20 msanwrite(addr, uintptr(len)) 21} 22 23// Private interface for the runtime. 24const msanenabled = true 25 26// If we are running on the system stack, the C program may have 27// marked part of that stack as uninitialized. We don't instrument 28// the runtime, but operations like a slice copy can call msanread 29// anyhow for values on the stack. Just ignore msanread when running 30// on the system stack. The other msan functions are fine. 31// 32//go:nosplit 33func msanread(addr unsafe.Pointer, sz uintptr) { 34 g := getg() 35 if g == nil || g.m == nil || g == g.m.g0 || g == g.m.gsignal { 36 return 37 } 38 domsanread(addr, sz) 39} 40 41//go:noescape 42func domsanread(addr unsafe.Pointer, sz uintptr) 43 44//go:noescape 45func msanwrite(addr unsafe.Pointer, sz uintptr) 46 47//go:noescape 48func msanmalloc(addr unsafe.Pointer, sz uintptr) 49 50//go:noescape 51func msanfree(addr unsafe.Pointer, sz uintptr) 52 53// These are called from msan_amd64.s 54//go:cgo_import_static __msan_read_go 55//go:cgo_import_static __msan_write_go 56//go:cgo_import_static __msan_malloc_go 57//go:cgo_import_static __msan_free_go 58