go/analysis/internal/analysisflags: use os.Executable for program path

For -V=full, use the os.Executable for the program path instead of os.Args[0].

Fixes golang/go#57716

Change-Id: Ia571f922aef037a16ffc78f8c2c32ae4c70918c1
Reviewed-on: https://go-review.googlesource.com/c/tools/+/461496
Run-TryBot: Tim King <taking@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
gopls-CI: kokoro <noreply+kokoro@google.com>
Reviewed-by: Alan Donovan <adonovan@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
diff --git a/go/analysis/internal/analysisflags/flags.go b/go/analysis/internal/analysisflags/flags.go
index 2ea6306..e127a42 100644
--- a/go/analysis/internal/analysisflags/flags.go
+++ b/go/analysis/internal/analysisflags/flags.go
@@ -206,7 +206,7 @@
 func (versionFlag) String() string   { return "" }
 func (versionFlag) Set(s string) error {
 	if s != "full" {
-		log.Fatalf("unsupported flag value: -V=%s", s)
+		log.Fatalf("unsupported flag value: -V=%s (use -V=full)", s)
 	}
 
 	// This replicates the minimal subset of
@@ -218,7 +218,10 @@
 	// Formats:
 	//   $progname version devel ... buildID=...
 	//   $progname version go1.9.1
-	progname := os.Args[0]
+	progname, err := os.Executable()
+	if err != nil {
+		return err
+	}
 	f, err := os.Open(progname)
 	if err != nil {
 		log.Fatal(err)
diff --git a/go/analysis/internal/analysisflags/flags_test.go b/go/analysis/internal/analysisflags/flags_test.go
index 1f055dd..b5cfb3d 100644
--- a/go/analysis/internal/analysisflags/flags_test.go
+++ b/go/analysis/internal/analysisflags/flags_test.go
@@ -42,7 +42,7 @@
 
 	for _, test := range []struct {
 		flags string
-		want  string
+		want  string // output should contain want
 	}{
 		{"", "[a1 a2 a3]"},
 		{"-a1=0", "[a2 a3]"},
@@ -50,6 +50,7 @@
 		{"-a1", "[a1]"},
 		{"-a1=1 -a3=1", "[a1 a3]"},
 		{"-a1=1 -a3=0", "[a1]"},
+		{"-V=full", "analysisflags.test version devel"},
 	} {
 		cmd := exec.Command(progname, "-test.run=TestExec")
 		cmd.Env = append(os.Environ(), "ANALYSISFLAGS_CHILD=1", "FLAGS="+test.flags)
@@ -60,8 +61,8 @@
 		}
 
 		got := strings.TrimSpace(string(output))
-		if got != test.want {
-			t.Errorf("got %s, want %s", got, test.want)
+		if !strings.Contains(got, test.want) {
+			t.Errorf("got %q, does not contain %q", got, test.want)
 		}
 	}
 }