]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: do not rewrite call if there are more args than parameters
authorIan Lance Taylor <iant@golang.org>
Thu, 11 Jul 2019 18:57:31 +0000 (11:57 -0700)
committerIan Lance Taylor <iant@golang.org>
Fri, 12 Jul 2019 17:31:29 +0000 (17:31 +0000)
We already skipped rewriting the call if there were fewer args than
parameters. But we can also get a cgo crash if there are more args,
if at least one of the extra args uses a name qualified with "C.".
Skip the rewrite, since the build will fail later anyhow.

Fixes #33061

Change-Id: I62ff3518b775b502ad10c2bacf9102db4c9a531c
Reviewed-on: https://go-review.googlesource.com/c/go/+/185797
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Andrew Bonventre <andybons@golang.org>
misc/cgo/errors/errors_test.go
misc/cgo/errors/testdata/issue33061.go [new file with mode: 0644]
src/cmd/cgo/gcc.go

index e6bac0fff4572ac3f71ca1dd17c288c88bb860b1..1bdf843451d366b693857abe92a11d31ede08d6f 100644 (file)
@@ -112,6 +112,7 @@ func TestReportsTypeErrors(t *testing.T) {
                "issue18452.go",
                "issue18889.go",
                "issue28721.go",
+               "issue33061.go",
        } {
                check(t, file)
        }
diff --git a/misc/cgo/errors/testdata/issue33061.go b/misc/cgo/errors/testdata/issue33061.go
new file mode 100644 (file)
index 0000000..77d5f7a
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// cgo shouldn't crash if there is an extra argument with a C reference.
+
+package main
+
+// void F(void* p) {};
+import "C"
+
+import "unsafe"
+
+func F() {
+       var i int
+       C.F(unsafe.Pointer(&i), C.int(0)) // ERROR HERE
+}
index 1bd3e2417ca71e5030f4b93e70ed77c951aa1a43..01b86adadbba0392206622de3e19c5efe10cf5f0 100644 (file)
@@ -793,10 +793,10 @@ func (p *Package) rewriteCall(f *File, call *Call) (string, bool) {
        params := name.FuncType.Params
        args := call.Call.Args
 
-       // Avoid a crash if the number of arguments is
-       // less than the number of parameters.
+       // Avoid a crash if the number of arguments doesn't match
+       // the number of parameters.
        // This will be caught when the generated file is compiled.
-       if len(args) < len(params) {
+       if len(args) != len(params) {
                return "", false
        }