aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2021-08-05 13:05:23 -0700
committerMatthew Dempsky <mdempsky@google.com>2021-08-05 20:22:31 +0000
commitfd45e267c2f6ce7c6a88842e3ad94d3469223e42 (patch)
tree0f721bdeb6a04dacbe298e6726c8bd09fe5af16d
parent6e738868a7a943d7d4fd6bb1963e7f6d78111726 (diff)
downloadgo-fd45e267c2f6ce7c6a88842e3ad94d3469223e42.tar.gz
go-fd45e267c2f6ce7c6a88842e3ad94d3469223e42.zip
runtime: warn that KeepAlive is not an unsafe.Pointer workaround
Even experienced users occasionally mistake that runtime.KeepAlive can be used as a workaround for following the unsafe.Pointer safety rules, but it cannot. Add an explicit warning to this effect to dissuade users from trying to use it as such. Fixes #47562. Change-Id: I842e33a3e1c080933c6b1bd1b6318448adbf495c Reviewed-on: https://go-review.googlesource.com/c/go/+/340269 Trust: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--src/runtime/mfinal.go4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/runtime/mfinal.go b/src/runtime/mfinal.go
index fd318d49a8..c134a0f22d 100644
--- a/src/runtime/mfinal.go
+++ b/src/runtime/mfinal.go
@@ -466,6 +466,10 @@ okarg:
// Without the KeepAlive call, the finalizer could run at the start of
// syscall.Read, closing the file descriptor before syscall.Read makes
// the actual system call.
+//
+// Note: KeepAlive should only be used to prevent finalizers from
+// running prematurely. In particular, when used with unsafe.Pointer,
+// the rules for valid uses of unsafe.Pointer still apply.
func KeepAlive(x interface{}) {
// Introduce a use of x that the compiler can't eliminate.
// This makes sure x is alive on entry. We need x to be alive