Commit daeb5efb authored by Matthew Dempsky's avatar Matthew Dempsky

runtime: somewhat better checkptr error messages

They're still lacking in details, but at least better than being
printed as raw interface values.

Updates #22218.

Change-Id: I4fd813253afdd6455c0c9b5a05c61659805abad1
Reviewed-on: https://go-review.googlesource.com/c/go/+/202677
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 9093b1de
...@@ -6,33 +6,45 @@ package runtime ...@@ -6,33 +6,45 @@ package runtime
import "unsafe" import "unsafe"
type ptrAlign struct { type ptrAlignError struct {
ptr unsafe.Pointer ptr unsafe.Pointer
elem *_type elem *_type
n uintptr n uintptr
} }
func (e ptrAlignError) RuntimeError() {}
func (e ptrAlignError) Error() string {
return "runtime error: unsafe pointer conversion"
}
func checkptrAlignment(p unsafe.Pointer, elem *_type, n uintptr) { func checkptrAlignment(p unsafe.Pointer, elem *_type, n uintptr) {
// Check that (*[n]elem)(p) is appropriately aligned. // Check that (*[n]elem)(p) is appropriately aligned.
// TODO(mdempsky): What about fieldAlign? // TODO(mdempsky): What about fieldAlign?
if uintptr(p)&(uintptr(elem.align)-1) != 0 { if uintptr(p)&(uintptr(elem.align)-1) != 0 {
panic(ptrAlign{p, elem, n}) panic(ptrAlignError{p, elem, n})
} }
// Check that (*[n]elem)(p) doesn't straddle multiple heap objects. // Check that (*[n]elem)(p) doesn't straddle multiple heap objects.
if size := n * elem.size; size > 1 && checkptrBase(p) != checkptrBase(add(p, size-1)) { if size := n * elem.size; size > 1 && checkptrBase(p) != checkptrBase(add(p, size-1)) {
panic(ptrAlign{p, elem, n}) panic(ptrAlignError{p, elem, n})
} }
} }
type ptrArith struct { type ptrArithError struct {
ptr unsafe.Pointer ptr unsafe.Pointer
originals []unsafe.Pointer originals []unsafe.Pointer
} }
func (e ptrArithError) RuntimeError() {}
func (e ptrArithError) Error() string {
return "runtime error: unsafe pointer arithmetic"
}
func checkptrArithmetic(p unsafe.Pointer, originals []unsafe.Pointer) { func checkptrArithmetic(p unsafe.Pointer, originals []unsafe.Pointer) {
if 0 < uintptr(p) && uintptr(p) < minLegalPointer { if 0 < uintptr(p) && uintptr(p) < minLegalPointer {
panic(ptrArith{p, originals}) panic(ptrArithError{p, originals})
} }
// Check that if the computed pointer p points into a heap // Check that if the computed pointer p points into a heap
...@@ -49,7 +61,7 @@ func checkptrArithmetic(p unsafe.Pointer, originals []unsafe.Pointer) { ...@@ -49,7 +61,7 @@ func checkptrArithmetic(p unsafe.Pointer, originals []unsafe.Pointer) {
} }
} }
panic(ptrArith{p, originals}) panic(ptrArithError{p, originals})
} }
func checkptrBase(p unsafe.Pointer) uintptr { func checkptrBase(p unsafe.Pointer) uintptr {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment