Commit 53937aad authored by Aliaksandr Valialkin's avatar Aliaksandr Valialkin Committed by Josh Bleecher Snyder

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/38064Reviewed-by: default avatarJosh Bleecher Snyder <josharian@gmail.com>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent cc71aa9a
...@@ -48,28 +48,6 @@ func checkLongShift(f *File, node ast.Node, x, y ast.Expr) { ...@@ -48,28 +48,6 @@ func checkLongShift(f *File, node ast.Node, x, y ast.Expr) {
return 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 v := f.pkg.types[y].Value
if v == nil { if v == nil {
return return
......
...@@ -102,5 +102,8 @@ func ShiftTest() { ...@@ -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 const oneIf64Bit = ^uint(0) >> 63 // allow large shifts of constants; they are used for 32/64 bit compatibility tricks
var h uintptr 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"
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment