]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/internal/atomic: add TestUnaligned64
authorBrad Fitzpatrick <bradfitz@golang.org>
Sat, 12 Nov 2016 05:58:52 +0000 (05:58 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sat, 12 Nov 2016 06:38:40 +0000 (06:38 +0000)
Add a variant of sync/atomic's TestUnaligned64 to
runtime/internal/atomic.

Skips the test on arm for now where it's currently failing.

Updates #17786

Change-Id: If63f9c1243e9db7b243a95205b2d27f7d1dc1e6e
Reviewed-on: https://go-review.googlesource.com/33159
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/internal/atomic/atomic_test.go

index d0a39a14332fd6904b241efde21e91d7b0c45ed3..c5fbc1a49570893423c6687cc7d115ab01eeca21 100644 (file)
@@ -66,3 +66,39 @@ func TestXadduintptrOnUint64(t *testing.T) {
                t.Fatalf("xadduintptr should increase lower-order bits, want %d, got %d", inc, val)
        }
 }
+
+func shouldPanic(t *testing.T, name string, f func()) {
+       defer func() {
+               if recover() == nil {
+                       t.Errorf("%s did not panic", name)
+               }
+       }()
+       f()
+}
+
+// Variant of sync/atomic's TestUnaligned64:
+func TestUnaligned64(t *testing.T) {
+       // Unaligned 64-bit atomics on 32-bit systems are
+       // a continual source of pain. Test that on 32-bit systems they crash
+       // instead of failing silently.
+
+       switch runtime.GOARCH {
+       default:
+               if unsafe.Sizeof(int(0)) != 4 {
+                       t.Skip("test only runs on 32-bit systems")
+               }
+       case "arm":
+               t.Skipf("TODO: implement. golang.org/issue/17786")
+       case "amd64p32", "mips", "mipsle":
+               // amd64p32 and mips can handle unaligned atomics.
+               t.Skipf("test not needed on %v", runtime.GOARCH)
+       }
+
+       x := make([]uint32, 4)
+       up64 := (*uint64)(unsafe.Pointer(&x[1])) // misaligned
+       p64 := (*int64)(unsafe.Pointer(&x[1]))   // misaligned
+
+       shouldPanic(t, "Load64", func() { atomic.Load64(up64) })
+       shouldPanic(t, "Loadint64", func() { atomic.Loadint64(p64) })
+       shouldPanic(t, "Store64", func() { atomic.Store64(up64, 0) })
+}