mirror of
https://github.com/golang/go
synced 2024-10-04 15:09:59 +00:00
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 <josharian@gmail.com> Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
cc71aa9ac4
commit
53937aad99
|
@ -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
|
||||
|
|
5
src/cmd/vet/testdata/shift.go
vendored
5
src/cmd/vet/testdata/shift.go
vendored
|
@ -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"
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue