Skip to content

staticcheck panics (nil pointer dereference) in CheckAllocationNilCheck with unnamed function #1268

@stapelberg

Description

@stapelberg

Hey!

I just tracked an issue in staticcheck down to the following standalone reproducer:

% staticcheck -version
staticcheck 2022.1.1 (v0.3.1)
staticcheck -debug.version
% staticcheck -debug.version
staticcheck -debug.version
staticcheck 2022.1.1 (v0.3.1)

Compiled with Go version: go1.18
Main module:
	honnef.co/go/tools@v0.3.1 (sum: h1:1kJlrWJLkaGXgcaeosRXViwviqjI7nkBvU2+sZW0AYc=)
Dependencies:
	github.com/BurntSushi/toml@v0.4.1 (sum: h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=)
	golang.org/x/exp/typeparams@v0.0.0-20220218215828-6cf2b201936e (sum: h1:qyrTQ++p1afMkO4DPEeLGq/3oTsdlvdH4vqZUBWzUKM=)
	golang.org/x/mod@v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 (sum: h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=)
	golang.org/x/sys@v0.0.0-20211019181941-9d821ace8654 (sum: h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=)
	golang.org/x/tools@v0.1.11-0.20220316014157-77aa08bb151a (sum: h1:ofrrl6c6NG5/IOSx/R1cyiQxxjqlur0h/TvbUhkH0II=)
	golang.org/x/xerrors@v0.0.0-20200804184101-5ec99f83aff1 (sum: h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=)
% go version
go version go1.18 linux/amd64
go env
% go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/michael/.cache/go-build"
GOENV="/home/michael/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/michael/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/michael/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/home/michael/sdk/go1.18"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/home/michael/sdk/go1.18/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.18"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK=""
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 -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1422223438=/tmp/go-build -gno-record-gcc-switches"

Steps to reproduce:

% cat > finder.go <<'EOT'
package main

import "io"

func initialize(*io.Reader) error { return nil }

func _() {
	var r io.Reader
	if err := initialize(&r); err != nil {
	}
}

func main() {
}
EOT

% staticcheck finder.go
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x80 pc=0x832176]

goroutine 447 [running]:
honnef.co/go/tools/go/ir.(*Function).debugInfo(...)
	/home/michael/go/pkg/mod/honnef.co/go/tools@v0.3.1/go/ir/func.go:684
honnef.co/go/tools/go/ir.(*Function).ValueForExpr(...)
	/home/michael/go/pkg/mod/honnef.co/go/tools@v0.3.1/go/ir/source.go:137
honnef.co/go/tools/staticcheck.CheckAllocationNilCheck.func1({0x9d1480?, 0xc0089e3e80?})
	/home/michael/go/pkg/mod/honnef.co/go/tools@v0.3.1/staticcheck/lint.go:5116 +0x1f6
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder(0xc0089ebea8, {0xc0085d65e8?, 0x1?, 0x0?}, 0xc00754fdf8)
	/home/michael/go/pkg/mod/golang.org/x/tools@v0.1.11-0.20220316014157-77aa08bb151a/go/ast/inspector/inspector.go:77 +0x9a
honnef.co/go/tools/analysis/code.Preorder(...)
	/home/michael/go/pkg/mod/honnef.co/go/tools@v0.3.1/analysis/code/visit.go:16
honnef.co/go/tools/staticcheck.CheckAllocationNilCheck(0xc008622820)
	/home/michael/go/pkg/mod/honnef.co/go/tools@v0.3.1/staticcheck/lint.go:5213 +0xdc
honnef.co/go/tools/lintcmd/runner.(*analyzerRunner).do(0xc008a23230, {0x9d4298?, 0xc008a21cc0})
	/home/michael/go/pkg/mod/honnef.co/go/tools@v0.3.1/lintcmd/runner/runner.go:1032 +0x614
honnef.co/go/tools/lintcmd/runner.genericHandle({0x9d4298?, 0xc008a21cc0}, {0x9d4298?, 0xc0089e83c0?}, 0x0?, 0xc0001759f0, 0xc008587c60)
	/home/michael/go/pkg/mod/honnef.co/go/tools@v0.3.1/lintcmd/runner/runner.go:857 +0x102
created by honnef.co/go/tools/lintcmd/runner.(*subrunner).runAnalyzers
	/home/michael/go/pkg/mod/honnef.co/go/tools@v0.3.1/lintcmd/runner/runner.go:1101 +0x705

Any idea what the issue might be and how to fix it?

Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions