From 1f231d74f6e6b7ce1ccdbf49fc12b022dd875196 Mon Sep 17 00:00:00 2001 From: Johan Jansson Date: Wed, 11 Mar 2020 21:05:21 +0200 Subject: [PATCH] runtime: emit more specific errors from checkptr Update error messages for pointer alignment checks and pointer arithmetic checks so that each type of error has a unique error message. Fixes #37488 Change-Id: Ida2c2fa3f041a3307d665879a463f9e8f2c1fd03 Reviewed-on: https://go-review.googlesource.com/c/go/+/223037 Reviewed-by: Matthew Dempsky Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/runtime/checkptr.go | 8 ++++---- src/runtime/checkptr_test.go | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/runtime/checkptr.go b/src/runtime/checkptr.go index ddbc8168af..8e401e8763 100644 --- a/src/runtime/checkptr.go +++ b/src/runtime/checkptr.go @@ -10,18 +10,18 @@ func checkptrAlignment(p unsafe.Pointer, elem *_type, n uintptr) { // Check that (*[n]elem)(p) is appropriately aligned. // TODO(mdempsky): What about fieldAlign? if uintptr(p)&(uintptr(elem.align)-1) != 0 { - throw("checkptr: unsafe pointer conversion") + throw("checkptr: misaligned pointer conversion") } // 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)) { - throw("checkptr: unsafe pointer conversion") + throw("checkptr: converted pointer straddles multiple allocations") } } func checkptrArithmetic(p unsafe.Pointer, originals []unsafe.Pointer) { if 0 < uintptr(p) && uintptr(p) < minLegalPointer { - throw("checkptr: unsafe pointer arithmetic") + throw("checkptr: pointer arithmetic computed bad pointer value") } // Check that if the computed pointer p points into a heap @@ -38,7 +38,7 @@ func checkptrArithmetic(p unsafe.Pointer, originals []unsafe.Pointer) { } } - throw("checkptr: unsafe pointer arithmetic") + throw("checkptr: pointer arithmetic result points to invalid allocation") } // checkptrBase returns the base address for the allocation containing diff --git a/src/runtime/checkptr_test.go b/src/runtime/checkptr_test.go index c5f22cc101..1a7c253733 100644 --- a/src/runtime/checkptr_test.go +++ b/src/runtime/checkptr_test.go @@ -24,10 +24,10 @@ func TestCheckPtr(t *testing.T) { cmd string want string }{ - {"CheckPtrAlignment", "fatal error: checkptr: unsafe pointer conversion\n"}, - {"CheckPtrArithmetic", "fatal error: checkptr: unsafe pointer arithmetic\n"}, - {"CheckPtrSize", "fatal error: checkptr: unsafe pointer conversion\n"}, - {"CheckPtrSmall", "fatal error: checkptr: unsafe pointer arithmetic\n"}, + {"CheckPtrAlignment", "fatal error: checkptr: misaligned pointer conversion\n"}, + {"CheckPtrArithmetic", "fatal error: checkptr: pointer arithmetic result points to invalid allocation\n"}, + {"CheckPtrSize", "fatal error: checkptr: converted pointer straddles multiple allocations\n"}, + {"CheckPtrSmall", "fatal error: checkptr: pointer arithmetic computed bad pointer value\n"}, } for _, tc := range testCases { -- 2.50.0