From 8f5fb95db6573f132bcfd0b3f9541faa84058fa0 Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Sun, 6 Mar 2016 13:04:52 +1100 Subject: [PATCH] cmd/compile/internal/gc: assert size of important types Add tests to ensure that the size of important types don't change unexpectedly. Skip the test on nacl platforms because of their unusual padding requirements. Change-Id: Iddb127a99499e089a309b721f5073356c0da8b24 Reviewed-on: https://go-review.googlesource.com/20285 Reviewed-by: Brad Fitzpatrick Run-TryBot: Dave Cheney Reviewed-by: Josh Bleecher Snyder TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/sizeof_test.go | 43 ++++++++++++++++++++++ src/cmd/internal/obj/sizeof_test.go | 40 ++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/cmd/compile/internal/gc/sizeof_test.go create mode 100644 src/cmd/internal/obj/sizeof_test.go diff --git a/src/cmd/compile/internal/gc/sizeof_test.go b/src/cmd/compile/internal/gc/sizeof_test.go new file mode 100644 index 0000000000..a0ae7ccdb9 --- /dev/null +++ b/src/cmd/compile/internal/gc/sizeof_test.go @@ -0,0 +1,43 @@ +// Copyright 2016 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. + +// +build !nacl + +package gc + +import ( + "reflect" + "testing" + "unsafe" +) + +// Assert that the size of important structures do not change unexpectedly. + +func TestSizeof(t *testing.T) { + const _64bit = unsafe.Sizeof(uintptr(0)) == 8 + + var tests = []struct { + val interface{} // type as a value + _32bit uintptr // size on 32bit platforms + _64bit uintptr // size on 64bit platforms + }{ + {Flow{}, 52, 88}, + {Func{}, 104, 184}, + {Name{}, 52, 80}, + {Node{}, 92, 144}, + {Sym{}, 64, 112}, + {Type{}, 144, 240}, + } + + for _, tt := range tests { + want := tt._32bit + if _64bit { + want = tt._64bit + } + got := reflect.TypeOf(tt.val).Size() + if want != got { + t.Errorf("unsafe.Sizeof(%T): want %d, got %d", tt.val, want, got) + } + } +} diff --git a/src/cmd/internal/obj/sizeof_test.go b/src/cmd/internal/obj/sizeof_test.go new file mode 100644 index 0000000000..70e62d0f9f --- /dev/null +++ b/src/cmd/internal/obj/sizeof_test.go @@ -0,0 +1,40 @@ +// Copyright 2016 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. + +// +build !nacl + +package obj + +import ( + "reflect" + "testing" + "unsafe" +) + +// Assert that the size of important structures do not change unexpectedly. + +func TestSizeof(t *testing.T) { + const _64bit = unsafe.Sizeof(uintptr(0)) == 8 + + var tests = []struct { + val interface{} // type as a value + _32bit uintptr // size on 32bit platforms + _64bit uintptr // size on 64bit platforms + }{ + {Addr{}, 52, 80}, + {LSym{}, 92, 152}, + {Prog{}, 196, 288}, + } + + for _, tt := range tests { + want := tt._32bit + if _64bit { + want = tt._64bit + } + got := reflect.TypeOf(tt.val).Size() + if want != got { + t.Errorf("unsafe.Sizeof(%T): want %d, got %d", tt.val, want, got) + } + } +} -- 2.48.1