]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.14] runtime: don't report a pointer alignment error for pointer...
authorKeith Randall <khr@golang.org>
Tue, 17 Mar 2020 20:27:11 +0000 (13:27 -0700)
committerCarlos Amedee <carlos@golang.org>
Wed, 18 Mar 2020 16:19:45 +0000 (16:19 +0000)
Fixes #37905

Change-Id: I8ba9c8b106e16cea7dd25473c7390b0f2ba9a1a5
Reviewed-on: https://go-review.googlesource.com/c/go/+/223781
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-on: https://go-review.googlesource.com/c/go/+/223749

src/runtime/checkptr.go
src/runtime/checkptr_test.go
src/runtime/testdata/testprog/checkptr.go

index ddbc8168afc11ab7f8d41fc34b1129f38c95f710..b6f2bc81bb7202c7b552d747594e101375d8153a 100644 (file)
@@ -8,8 +8,10 @@ import "unsafe"
 
 func checkptrAlignment(p unsafe.Pointer, elem *_type, n uintptr) {
        // Check that (*[n]elem)(p) is appropriately aligned.
+       // Note that we allow unaligned pointers if the types they point to contain
+       // no pointers themselves. See issue 37298.
        // TODO(mdempsky): What about fieldAlign?
-       if uintptr(p)&(uintptr(elem.align)-1) != 0 {
+       if elem.ptrdata != 0 && uintptr(p)&(uintptr(elem.align)-1) != 0 {
                throw("checkptr: unsafe pointer conversion")
        }
 
index c5f22cc1015c4e28e31b5aaa8ebe711d0a718800..624f1b62d2f2454d8aab514b72257ebcfbe2b45f 100644 (file)
@@ -24,7 +24,8 @@ func TestCheckPtr(t *testing.T) {
                cmd  string
                want string
        }{
-               {"CheckPtrAlignment", "fatal error: checkptr: unsafe pointer conversion\n"},
+               {"CheckPtrAlignmentPtr", "fatal error: checkptr: unsafe pointer conversion\n"},
+               {"CheckPtrAlignmentNoPtr", ""},
                {"CheckPtrArithmetic", "fatal error: checkptr: unsafe pointer arithmetic\n"},
                {"CheckPtrSize", "fatal error: checkptr: unsafe pointer conversion\n"},
                {"CheckPtrSmall", "fatal error: checkptr: unsafe pointer arithmetic\n"},
@@ -38,6 +39,12 @@ func TestCheckPtr(t *testing.T) {
                        if err != nil {
                                t.Log(err)
                        }
+                       if tc.want == "" {
+                               if len(got) > 0 {
+                                       t.Errorf("output:\n%s\nwant no output", got)
+                               }
+                               return
+                       }
                        if !strings.HasPrefix(string(got), tc.want) {
                                t.Errorf("output:\n%s\n\nwant output starting with: %s", got, tc.want)
                        }
index 177db38e5ab68e3103790878bb36484573ed95c5..45e6fb1aa53f6c463ad7a8196439505372a00526 100644 (file)
@@ -7,18 +7,25 @@ package main
 import "unsafe"
 
 func init() {
-       register("CheckPtrAlignment", CheckPtrAlignment)
+       register("CheckPtrAlignmentNoPtr", CheckPtrAlignmentNoPtr)
+       register("CheckPtrAlignmentPtr", CheckPtrAlignmentPtr)
        register("CheckPtrArithmetic", CheckPtrArithmetic)
        register("CheckPtrSize", CheckPtrSize)
        register("CheckPtrSmall", CheckPtrSmall)
 }
 
-func CheckPtrAlignment() {
+func CheckPtrAlignmentNoPtr() {
        var x [2]int64
        p := unsafe.Pointer(&x[0])
        sink2 = (*int64)(unsafe.Pointer(uintptr(p) + 1))
 }
 
+func CheckPtrAlignmentPtr() {
+       var x [2]int64
+       p := unsafe.Pointer(&x[0])
+       sink2 = (**int64)(unsafe.Pointer(uintptr(p) + 1))
+}
+
 func CheckPtrArithmetic() {
        var x int
        i := uintptr(unsafe.Pointer(&x))