From 73a81d84b644da13bb11ce2e63d7f61041f7ebac Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 1 Apr 2022 09:41:57 +0200 Subject: [PATCH] cmd/cgo: retain original file paths in godefs generated comment Don't rewrite relative file paths to absolute file paths in the godefs generated code comment. Fixes #52063 Change-Id: Ie9c5bd021b8f3954e827838930861622c7aa90b4 Reviewed-on: https://go-review.googlesource.com/c/go/+/396936 Trust: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Gopher Robot Reviewed-by: Ian Lance Taylor --- misc/cgo/testgodefs/testgodefs_test.go | 26 +++++++++++++++++++++++++- src/cmd/cgo/godefs.go | 4 ++-- src/cmd/cgo/main.go | 6 +++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/misc/cgo/testgodefs/testgodefs_test.go b/misc/cgo/testgodefs/testgodefs_test.go index 7628ffc595..d03769ea87 100644 --- a/misc/cgo/testgodefs/testgodefs_test.go +++ b/misc/cgo/testgodefs/testgodefs_test.go @@ -9,6 +9,7 @@ import ( "os" "os/exec" "path/filepath" + "runtime" "strings" "testing" ) @@ -58,9 +59,32 @@ func TestGoDefs(t *testing.T) { t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr) } - if err := os.WriteFile(filepath.Join(dir, fp+"_defs.go"), out, 0644); err != nil { + fn := fp + "_defs.go" + if err := os.WriteFile(filepath.Join(dir, fn), out, 0644); err != nil { t.Fatal(err) } + + // Verify that command line arguments are not rewritten in the generated comment, + // see go.dev/issue/52063 + hasGeneratedByComment := false + for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { + cgoExe := "cgo" + if runtime.GOOS == "windows" { + cgoExe = "cgo.exe" + } + if !strings.HasPrefix(line, "// "+cgoExe+" -godefs") { + continue + } + if want := "// " + cgoExe + " " + strings.Join(cmd.Args[3:], " "); line != want { + t.Errorf("%s: got generated comment %q, want %q", fn, line, want) + } + hasGeneratedByComment = true + break + } + + if !hasGeneratedByComment { + t.Errorf("%s: comment with generating cgo -godefs command not found", fn) + } } main, err := os.ReadFile(filepath.Join("testdata", "main.go")) diff --git a/src/cmd/cgo/godefs.go b/src/cmd/cgo/godefs.go index c0d59aee01..3a27b31bfb 100644 --- a/src/cmd/cgo/godefs.go +++ b/src/cmd/cgo/godefs.go @@ -16,11 +16,11 @@ import ( ) // godefs returns the output for -godefs mode. -func (p *Package) godefs(f *File) string { +func (p *Package) godefs(f *File, args []string) string { var buf bytes.Buffer fmt.Fprintf(&buf, "// Code generated by cmd/cgo -godefs; DO NOT EDIT.\n") - fmt.Fprintf(&buf, "// %s %s\n", filepath.Base(os.Args[0]), strings.Join(os.Args[1:], " ")) + fmt.Fprintf(&buf, "// %s %s\n", filepath.Base(args[0]), strings.Join(args[1:], " ")) fmt.Fprintf(&buf, "\n") override := make(map[string]string) diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go index 14642b7576..364d8b81fb 100644 --- a/src/cmd/cgo/main.go +++ b/src/cmd/cgo/main.go @@ -291,6 +291,10 @@ func main() { usage() } + // Save original command line arguments for the godefs generated comment. Relative file + // paths in os.Args will be rewritten to absolute file paths in the loop below. + osArgs := make([]string, len(os.Args)) + copy(osArgs, os.Args[:]) goFiles := args[i:] for _, arg := range args[:i] { @@ -390,7 +394,7 @@ func main() { p.PackagePath = f.Package p.Record(f) if *godefs { - os.Stdout.WriteString(p.godefs(f)) + os.Stdout.WriteString(p.godefs(f, osArgs)) } else { p.writeOutput(f, input) }