| // Copyright 2021 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. |
| |
| //go:build asan |
| |
| package runtime |
| |
| import ( |
| "internal/runtime/sys" |
| "unsafe" |
| ) |
| |
| // Public address sanitizer API. |
| func ASanRead(addr unsafe.Pointer, len int) { |
| sp := sys.GetCallerSP() |
| pc := sys.GetCallerPC() |
| doasanread(addr, uintptr(len), sp, pc) |
| } |
| |
| func ASanWrite(addr unsafe.Pointer, len int) { |
| sp := sys.GetCallerSP() |
| pc := sys.GetCallerPC() |
| doasanwrite(addr, uintptr(len), sp, pc) |
| } |
| |
| // Private interface for the runtime. |
| const asanenabled = true |
| |
| // asan{read,write} are nosplit because they may be called between |
| // fork and exec, when the stack must not grow. See issue #50391. |
| |
| //go:linkname asanread |
| //go:nosplit |
| func asanread(addr unsafe.Pointer, sz uintptr) { |
| sp := sys.GetCallerSP() |
| pc := sys.GetCallerPC() |
| doasanread(addr, sz, sp, pc) |
| } |
| |
| //go:linkname asanwrite |
| //go:nosplit |
| func asanwrite(addr unsafe.Pointer, sz uintptr) { |
| sp := sys.GetCallerSP() |
| pc := sys.GetCallerPC() |
| doasanwrite(addr, sz, sp, pc) |
| } |
| |
| //go:noescape |
| func doasanread(addr unsafe.Pointer, sz, sp, pc uintptr) |
| |
| //go:noescape |
| func doasanwrite(addr unsafe.Pointer, sz, sp, pc uintptr) |
| |
| //go:noescape |
| func asanunpoison(addr unsafe.Pointer, sz uintptr) |
| |
| //go:noescape |
| func asanpoison(addr unsafe.Pointer, sz uintptr) |
| |
| //go:noescape |
| func asanregisterglobals(addr unsafe.Pointer, n uintptr) |
| |
| // These are called from asan_GOARCH.s |
| // |
| //go:cgo_import_static __asan_read_go |
| //go:cgo_import_static __asan_write_go |
| //go:cgo_import_static __asan_unpoison_go |
| //go:cgo_import_static __asan_poison_go |
| //go:cgo_import_static __asan_register_globals_go |