Source file src/runtime/msan.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  //go:build msan
     6  
     7  package runtime
     8  
     9  import (
    10  	"unsafe"
    11  )
    12  
    13  // Public memory sanitizer API.
    14  
    15  func MSanRead(addr unsafe.Pointer, len int) {
    16  	msanread(addr, uintptr(len))
    17  }
    18  
    19  func MSanWrite(addr unsafe.Pointer, len int) {
    20  	msanwrite(addr, uintptr(len))
    21  }
    22  
    23  // Private interface for the runtime.
    24  const 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:linkname msanread
    33  //go:nosplit
    34  func msanread(addr unsafe.Pointer, sz uintptr) {
    35  	gp := getg()
    36  	if gp == nil || gp.m == nil || gp == gp.m.g0 || gp == gp.m.gsignal {
    37  		return
    38  	}
    39  	domsanread(addr, sz)
    40  }
    41  
    42  //go:noescape
    43  func domsanread(addr unsafe.Pointer, sz uintptr)
    44  
    45  //go:linkname msanwrite
    46  //go:noescape
    47  func msanwrite(addr unsafe.Pointer, sz uintptr)
    48  
    49  //go:linkname msanmalloc
    50  //go:noescape
    51  func msanmalloc(addr unsafe.Pointer, sz uintptr)
    52  
    53  //go:linkname msanfree
    54  //go:noescape
    55  func msanfree(addr unsafe.Pointer, sz uintptr)
    56  
    57  //go:linkname msanmove
    58  //go:noescape
    59  func msanmove(dst, src unsafe.Pointer, sz uintptr)
    60  
    61  // These are called from msan_GOARCH.s
    62  //
    63  //go:cgo_import_static __msan_read_go
    64  //go:cgo_import_static __msan_write_go
    65  //go:cgo_import_static __msan_malloc_go
    66  //go:cgo_import_static __msan_free_go
    67  //go:cgo_import_static __msan_memmove
    68  

View as plain text