// Copyright 2019 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This file contains tests for the atomic alignment checker. // +build arm 386 package testdata import ( "io" "sync/atomic" ) func intsAlignment() { var s struct { a bool b uint8 c int8 d byte f int16 g int16 h int64 i byte j uint64 } atomic.AddInt64(&s.h, 9) atomic.AddUint64(&s.j, 0) // want "address of non 64-bit aligned field .j passed to atomic.AddUint64" } func floatAlignment() { var s struct { a float32 b int64 c float32 d float64 e uint64 } atomic.LoadInt64(&s.b) // want "address of non 64-bit aligned field .b passed to atomic.LoadInt64" atomic.LoadUint64(&s.e) } func uintptrAlignment() { var s struct { a uintptr b int64 c int d uint e int32 f uint64 } atomic.StoreInt64(&s.b, 0) // want "address of non 64-bit aligned field .b passed to atomic.StoreInt64" atomic.StoreUint64(&s.f, 0) } func runeAlignment() { var s struct { a rune b int64 _ rune c uint64 } atomic.SwapInt64(&s.b, 0) // want "address of non 64-bit aligned field .b passed to atomic.SwapInt64" atomic.SwapUint64(&s.c, 0) } func complexAlignment() { var s struct { a complex64 b int64 c complex128 d uint64 } atomic.CompareAndSwapInt64(&s.b, 0, 1) atomic.CompareAndSwapUint64(&s.d, 0, 1) } // continuer ici avec les tests func channelAlignment() { var a struct { a chan struct{} b int64 c <-chan struct{} d uint64 } atomic.AddInt64(&a.b, 0) // want "address of non 64-bit aligned field .b passed to atomic.AddInt64" atomic.AddUint64(&a.d, 0) } func arrayAlignment() { var a struct { a [1]uint16 b int64 _ [2]uint16 c int64 d [1]uint16 e uint64 } atomic.LoadInt64(&a.b) // want "address of non 64-bit aligned field .b passed to atomic.LoadInt64" atomic.LoadInt64(&a.c) atomic.LoadUint64(&a.e) // want "address of non 64-bit aligned field .e passed to atomic.LoadUint64" } func anonymousFieldAlignment() { var f struct { a, b int32 c, d int64 _ bool e, f uint64 } atomic.StoreInt64(&f.c, 12) atomic.StoreInt64(&f.d, 27) atomic.StoreUint64(&f.e, 6) // want "address of non 64-bit aligned field .e passed to atomic.StoreUint64" atomic.StoreUint64(&f.f, 79) // want "address of non 64-bit aligned field .f passed to atomic.StoreUint64" } type ts struct { e int64 e2 []int f uint64 } func typedStructAlignment() { var b ts atomic.SwapInt64(&b.e, 9) atomic.SwapUint64(&b.f, 9) // want "address of non 64-bit aligned field .f passed to atomic.SwapUint64" } func aliasAlignment() { type ( mybytea uint8 mybyteb byte mybytec = uint8 mybyted = byte ) var e struct { a byte b mybytea c mybyteb e mybytec f int64 g, h uint16 i uint64 } atomic.CompareAndSwapInt64(&e.f, 0, 1) // want "address of non 64-bit aligned field .f passed to atomic.CompareAndSwapInt64" atomic.CompareAndSwapUint64(&e.i, 1, 2) } func stringAlignment() { var a struct { a uint32 b string c int64 } atomic.AddInt64(&a.c, 10) // want "address of non 64-bit aligned field .c passed to atomic.AddInt64" } func sliceAlignment() { var s struct { a []int32 b int64 c uint32 d uint64 } atomic.LoadInt64(&s.b) // want "address of non 64-bit aligned field .b passed to atomic.LoadInt64" atomic.LoadUint64(&s.d) } func interfaceAlignment() { var s struct { a interface{} b int64 c io.Writer e int64 _ int32 f uint64 } atomic.StoreInt64(&s.b, 9) atomic.StoreInt64(&s.e, 9) atomic.StoreUint64(&s.f, 9) // want "address of non 64-bit aligned field .f passed to atomic.StoreUint64" } func pointerAlignment() { var s struct { a, b *int c int64 d *interface{} e uint64 } atomic.SwapInt64(&s.c, 9) atomic.SwapUint64(&s.e, 9) // want "address of non 64-bit aligned field .e passed to atomic.SwapUint64" } // non-struct fields are already 64-bits correctly aligned per Go spec func nonStructFields() { var ( a *int64 b [2]uint64 c int64 ) atomic.CompareAndSwapInt64(a, 10, 11) atomic.CompareAndSwapUint64(&b[0], 5, 23) atomic.CompareAndSwapInt64(&c, -1, -15) } func embeddedStructFields() { var s1 struct { _ struct{ _ int32 } a int64 _ struct{} b uint64 _ struct{ _ [2]uint16 } c int64 } atomic.AddInt64(&s1.a, 9) // want "address of non 64-bit aligned field .a passed to atomic.AddInt64" atomic.AddUint64(&s1.b, 9) // want "address of non 64-bit aligned field .b passed to atomic.AddUint64" atomic.AddInt64(&s1.c, 9) }