golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
122.94k stars 17.53k forks source link

x/tools/go/pointer: internal panic in pointer analysis #41877

Closed goodmorning-coder closed 7 months ago

goodmorning-coder commented 3 years ago

What version of Go are you using (go version)?

$ go version
go version go1.15.2 linux/amd64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/Alice/.cache/go-build"
GOENV="/home/Alice/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/Alice/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/Alice/go"
GOPRIVATE=""
GOPROXY="https://goproxy.cn,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
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-build803063649=/tmp/go-build -gno-record-gcc-switches"

What did you do?

I wrote a program

package main

import (
    "golang.org/x/tools/go/packages"
    "golang.org/x/tools/go/pointer"
    "golang.org/x/tools/go/ssa"
    "golang.org/x/tools/go/ssa/ssautil"
    "log"
    "strings"
)

func main() {
    cfg := &packages.Config{Mode: packages.LoadAllSyntax, Tests: true}
    initial, err := packages.Load(cfg, "/path/to/bug_test.go")
    if err != nil {
        log.Fatal(err)
    }

    if packages.PrintErrors(initial) > 0 {
        log.Fatalf("packages contain errors")
    }

    prog, pkgs := ssautil.Packages(initial, ssa.PrintPackages)
    _ = prog

    var mains []*ssa.Package

    for _, p := range pkgs {
        if p != nil {
            p.Build()
        }

        if strings.HasSuffix(p.Pkg.Path(), ".test") {
            mains = append(mains, p)
        }
    }

    config := &pointer.Config{
        Mains:           mains,
        BuildCallGraph:  true,
        Log: log.Writer(),
    }

    pointer.Analyze(config)
}

bug_test.go

package bug_test

import "testing"

func TestFunc(t *testing.T) {
}

What did you expect to see?

No panic

What did you see instead?

==== Generating constraints for cg3:(*reflect.rtype).Align, shared contour
Internal panic in pointer analysis:
goroutine 1 [running]:
runtime/debug.Stack(0x24, 0x0, 0x0)
        /usr/local/go/src/runtime/debug/stack.go:24 +0x9f
runtime/debug.PrintStack()
        /usr/local/go/src/runtime/debug/stack.go:16 +0x25
golang.org/x/tools/go/pointer.Analyze.func1(0xc002a1fe48)
        /home/Alice/go/src/golang.org/x/tools/go/pointer/analysis.go:227 +0x10b
panic(0x6d5080, 0xc004e5b540)
        /usr/local/go/src/runtime/panic.go:969 +0x175
golang.org/x/tools/go/ssa.writeSignature(0xc0052fca80, 0xc005544780, 0xc005797f99, 0x5, 0xc006496f90, 0x0, 0x0, 0x0)
        /home/Alice/go/src/golang.org/x/tools/go/ssa/func.go:522 +0x286
golang.org/x/tools/go/ssa.WriteFunction(0xc0052fca80, 0xc002a1f770)
        /home/Alice/go/src/golang.org/x/tools/go/ssa/func.go:585 +0x1c5
golang.org/x/tools/go/ssa.(*Function).WriteTo(0xc002a1f770, 0x74fd20, 0xc0000be010, 0x29, 0xc002a1f750, 0x2)
        /home/Alice/go/src/golang.org/x/tools/go/ssa/func.go:544 +0x4e
golang.org/x/tools/go/pointer.(*analysis).genFunc(0xc00109c1c0, 0xc001cfcfc0)
        /home/Alice/go/src/golang.org/x/tools/go/pointer/gen.go:1166 +0x919
golang.org/x/tools/go/pointer.(*analysis).generate(0xc00109c1c0)
        /home/Alice/go/src/golang.org/x/tools/go/pointer/gen.go:1305 +0x187
golang.org/x/tools/go/pointer.Analyze(0xc002a28aa0, 0x0, 0x74fbc0, 0xc001bb5150)
        /home/Alice/go/src/golang.org/x/tools/go/pointer/analysis.go:292 +0x478
main.main()
        /home/Alice/go/src/10.3.0.221/Alice/ryze/cmd/bug/main.go:44 +0x405
georgettica commented 3 years ago

I am taking a look at this can you please assign me?

georgettica commented 3 years ago

@goodmorning-coder , @ALTree this issue seems to be because the func being tested had zero args, writing PR now to add a nil check

gopherbot commented 3 years ago

Change https://golang.org/cl/260998 mentions this issue: tools: guard against nil params

dmitshur commented 3 years ago

CC @golang/tools-team per owners.

adonovan commented 7 months ago

x/tools/go/pointer was deleted; see #59676.