From 53937aad99f1d1e177fca3a3d0ec5c83825e015b Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 13 Mar 2017 18:29:46 +0200 Subject: [PATCH] cmd/vet: check shift calculations with "unsafe" package vet should properly handle shift calculations via "unsafe" package after the CL 37950. Change-Id: I7737f2e656a5166337a17b92db46a0997f2a4e0e Reviewed-on: https://go-review.googlesource.com/38064 Reviewed-by: Josh Bleecher Snyder Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot --- src/cmd/vet/shift.go | 22 ---------------------- src/cmd/vet/testdata/shift.go | 5 ++++- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/src/cmd/vet/shift.go b/src/cmd/vet/shift.go index 200e20fd9d..17531bfc75 100644 --- a/src/cmd/vet/shift.go +++ b/src/cmd/vet/shift.go @@ -48,28 +48,6 @@ func checkLongShift(f *File, node ast.Node, x, y ast.Expr) { return } - // Ignore shifts where the shift amount is calculated using unsafe. - // These are used for bit-twiddling tricks. - var hasUnsafe bool - ast.Inspect(y, func(n ast.Node) bool { - sel, ok := n.(*ast.SelectorExpr) - if !ok { - return true - } - pkg, ok := sel.X.(*ast.Ident) - if !ok { - return true - } - if pkg.Name == "unsafe" { - hasUnsafe = true - return false - } - return true - }) - if hasUnsafe { - return - } - v := f.pkg.types[y].Value if v == nil { return diff --git a/src/cmd/vet/testdata/shift.go b/src/cmd/vet/testdata/shift.go index 40c8c8aa4f..d43b941f12 100644 --- a/src/cmd/vet/testdata/shift.go +++ b/src/cmd/vet/testdata/shift.go @@ -102,5 +102,8 @@ func ShiftTest() { const oneIf64Bit = ^uint(0) >> 63 // allow large shifts of constants; they are used for 32/64 bit compatibility tricks var h uintptr - h = h<<8 | (h >> (8 * (unsafe.Sizeof(h) - 1))) // shifts by unsafe amounts are safe + h = h<<8 | (h >> (8 * (unsafe.Sizeof(h) - 1))) + h <<= 8 * unsafe.Sizeof(h) // ERROR "too small for shift" + h >>= 7 * unsafe.Alignof(h) + h >>= 8 * unsafe.Alignof(h) // ERROR "too small for shift" } -- 2.48.1