x/tools/go/analysis/passes/atomicalign: 在针对k8s.io/apiserver/pkg/server运行时出现恐慌,GOOS/GOARCH为linux/arm,

goucqfw6  于 5个月前  发布在  Go
关注(0)|答案(6)|浏览(50)

你正在使用的Go版本是什么( go version )?

$ go version 1.13

这个问题在最新版本的发布中是否会重现?

是的

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/james/Library/Caches/go-build"
GOENV="/Users/james/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/james/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/Cellar/go/1.13/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.13/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/james/go/src/k8s.io/apiserver/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/l9/dkb2dtzj0cj6my4hm0t1hf6m0000gn/T/go-build247262007=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?

尝试使用 atomicalign go vet插件与 GOOS=linuxGOARCH=armk8s.io/apiserver/pkg/server 上进行对比,但在 ref bfa5e2e684ad413c22fd0dab55b2592af1ead049 处会导致恐慌。在 linux/amd64darwin/amd64linux/arm64 上不会出现这种情况。

复现问题的脚本:

#!/usr/bin/env bash

tmp=$(mktemp -d)
cd "$tmp"

mkdir atomicalign
cd atomicalign
go mod init atomicalign

cat <<EOF > main.go
// The atomicalign command runs the atomicalign analyzer.
package main

import (
"golang.org/x/tools/go/analysis/passes/atomicalign"
"golang.org/x/tools/go/analysis/multichecker"
)

func main() { multichecker.Main(atomicalign.Analyzer) }
EOF

# Build atomicalign entrypoint binary
go build .

cd ../
git clone https://github.com/kubernetes/apiserver.git
cd apiserver

git checkout bfa5e2e684ad413c22fd0dab55b2592af1ead049

## This command should pass
# GOOS=linux GOARCH=arm64 ../atomicalign/atomicalign ./pkg/server

## This command fails
GOOS=linux GOARCH=arm ../atomicalign/atomicalign ./pkg/server

你期望看到什么?

govet检查在所有平台上都能通过

你看到了什么?

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x1196742]

goroutine 5848 [running]:
go/types.(*Selection).Obj(...)
    /usr/local/Cellar/go/1.13/libexec/src/go/types/selection.go:56
golang.org/x/tools/go/analysis/passes/atomicalign.check64BitAlignment(0xc001825540, 0xc00029a5a6, 0x9, 0x13f20e0, 0xc000aa9f80)
    /Users/james/go/pkg/mod/golang.org/x/tools@v0.0.0-20191001184121-329c8d646ebe/go/analysis/passes/atomicalign/atomicalign.go:87 +0xb2
golang.org/x/tools/go/analysis/passes/atomicalign.run.func1(0x13ed420, 0xc0001ecac0)
    /Users/james/go/pkg/mod/golang.org/x/tools@v0.0.0-20191001184121-329c8d646ebe/go/analysis/passes/atomicalign/atomicalign.go:65 +0x172
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder(0xc001b9f0a0, 0xc000032ce8, 0x1, 0x1, 0xc0004becd8)
    /Users/james/go/pkg/mod/golang.org/x/tools@v0.0.0-20191001184121-329c8d646ebe/go/ast/inspector/inspector.go:77 +0x9f
golang.org/x/tools/go/analysis/passes/atomicalign.run(0xc001825540, 0xc001c3da90, 0x15ebac0, 0xc001b96ad8, 0x203000)
    /Users/james/go/pkg/mod/golang.org/x/tools@v0.0.0-20191001184121-329c8d646ebe/go/analysis/passes/atomicalign/atomicalign.go:42 +0x158
golang.org/x/tools/go/analysis/internal/checker.(*action).execOnce(0xc00183d040)
    /Users/james/go/pkg/mod/golang.org/x/tools@v0.0.0-20191001184121-329c8d646ebe/go/analysis/internal/checker/checker.go:646 +0x6fa
sync.(*Once).doSlow(0xc00183d040, 0xc000032f90)
    /usr/local/Cellar/go/1.13/libexec/src/sync/once.go:66 +0xe3
sync.(*Once).Do(...)
    /usr/local/Cellar/go/1.13/libexec/src/sync/once.go:57
golang.org/x/tools/go/analysis/internal/checker.(*action).exec(0xc00183d040)
    /Users/james/go/pkg/mod/golang.org/x/tools@v0.0.0-20191001184121-329c8d646ebe/go/analysis/internal/checker/checker.go:565 +0x60
golang.org/x/tools/go/analysis/internal/checker.execAll.func1(0xc00183d040)
    /Users/james/go/pkg/mod/golang.org/x/tools@v0.0.0-20191001184121-329c8d646ebe/go/analysis/internal/checker/checker.go:553 +0x34
created by golang.org/x/tools/go/analysis/internal/checker.execAll
    /Users/james/go/pkg/mod/golang.org/x/tools@v0.0.0-20191001184121-329c8d646ebe/go/analysis/internal/checker/checker.go:559 +0x119

cc @matloob@jayconrod

enxuqcxy

enxuqcxy1#

为了澄清,我们通常不会在构建中使用带有GOOS/GOARCH参数的go vet,但是我们使用Bazel进行构建,并最近启用了nogo检查。

在构建过程中,我们还会使用--platforms标志来为许多不同的架构构建,由于nogo在bazel build时间运行,它根据这个--platforms标志设置GOOS和GOARCH,因此也使用了这些标志调用go vet

另外,我不确定GOOS和GOARCH对go vet有什么影响...虽然这个bug应该在Go中解决,因为恐慌永远不是好事,但我确实想知道Bazel是否应该以这种方式调用这些目标。

rxztt3cl

rxztt3cl2#

设置 GOOSGOARCH 可能会影响加载哪些文件以及被构建约束排除哪些文件。go vet 和 nogo 都需要考虑到这一点,否则它们将无法加载正确的类型信息。此外,它们还需要构建一个跨平台的类型大小列表。

我不确定 atomicalign 是否会考虑这些标志。大多数分析只会查看加载并传递的类型信息,但这个可能会根据目标平台的对齐约束而有所不同。

2fjabf4q

2fjabf4q3#

我不确定atomicalign是否考虑了这些标志。大多数分析只会查看加载和传递的类型信息,但这个可能会根据目标平台的对齐约束而有所不同。
是的,atomicalign在不受原子BUG影响的平台上是一个无操作。
此外,由于这个分析器正在寻找特定于架构的对齐,它应该仅在目标架构上运行,而不是通过覆盖GOOS而不是GOARCH来运行。
话虽如此,它也不应该崩溃。
我可以调查一下(我曾经参与过这个分析器的开发)

7vux5j2d

7vux5j2d4#

崩溃不是由于 atomicalignGOOS/GOARCH != go env GOOS/GOARCH 一起运行造成的。事实上,atomicalign 没有正确处理在另一个包中导出的全局变量上使用 sync/atomic 函数的情况。
我目前正在准备一个修复方案,以便正确处理这种情况。

ohtdti5x

ohtdti5x5#

太棒了,谢谢你!

ux6nzvsh

ux6nzvsh6#

https://golang.org/cl/207289提到了这个问题:go/analysis/passes/atomicalign: handle various selector types

相关问题