aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/gc/walk.go2
-rw-r--r--src/runtime/checkptr.go12
2 files changed, 10 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go
index d8fc0abf3f..a9628096e7 100644
--- a/src/cmd/compile/internal/gc/walk.go
+++ b/src/cmd/compile/internal/gc/walk.go
@@ -3910,7 +3910,7 @@ func isRuneCount(n *Node) bool {
}
func walkCheckPtrAlignment(n *Node, init *Nodes) *Node {
- if n.Type.Elem().Alignment() == 1 {
+ if n.Type.Elem().Alignment() == 1 && n.Type.Elem().Size() == 1 {
return n
}
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})
}
}