aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/checkptr.go
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2019-10-17 12:06:53 -0700
committerMatthew Dempsky <mdempsky@google.com>2019-10-17 19:29:20 +0000
commitdc72a2f95feebcfe5ccbd50636b8f8db05587d5f (patch)
tree20de26bab1c41d7934bd7cfba5cfbb2efb79c841 /src/runtime/checkptr.go
parent4edd78d9f8322f3627dbdc83775bf2134502a1ef (diff)
downloadgo-dc72a2f95feebcfe5ccbd50636b8f8db05587d5f.tar.gz
go-dc72a2f95feebcfe5ccbd50636b8f8db05587d5f.zip
cmd/compile: detect unsafe conversions from smaller to larger types
This CL extends the runtime instrumentation for (*T)(ptr) to also check that the first and last bytes of *(*T)(ptr) are part of the same heap object. Updates #22218. Updates #34959. Change-Id: I2c8063fe1b7fe6e6145e41c5654cb64dd1c9dd41 Reviewed-on: https://go-review.googlesource.com/c/go/+/201778 Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/checkptr.go')
-rw-r--r--src/runtime/checkptr.go12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/runtime/checkptr.go b/src/runtime/checkptr.go
index 040a19a39c..a6d33c5af1 100644
--- a/src/runtime/checkptr.go
+++ b/src/runtime/checkptr.go
@@ -7,14 +7,20 @@ package runtime
import "unsafe"
type ptrAlign struct {
- ptr unsafe.Pointer
- align uintptr
+ ptr unsafe.Pointer
+ elem *_type
}
func checkptrAlignment(p unsafe.Pointer, elem *_type) {
+ // Check that (*T)(p) is appropriately aligned.
// TODO(mdempsky): What about fieldAlign?
if uintptr(p)&(uintptr(elem.align)-1) != 0 {
- panic(ptrAlign{p, uintptr(elem.align)})
+ panic(ptrAlign{p, elem})
+ }
+
+ // Check that (*T)(p) doesn't straddle multiple heap objects.
+ if elem.size != 1 && checkptrBase(p) != checkptrBase(add(p, elem.size-1)) {
+ panic(ptrAlign{p, elem})
}
}