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 <josharian@gmail.com>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
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
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"
}