summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-04-16 23:06:37 -0400
committerRuss Cox <rsc@golang.org>2014-04-16 23:06:37 -0400
commit8ab1ac597d871988cfdbe79050c66c9a35ca966a (patch)
tree7265598df8ac46510ea199ab6bbf950781915d58 /misc
parent254922ddce9930f7a307e055ccecbdc7078bc740 (diff)
downloadgo-8ab1ac597d871988cfdbe79050c66c9a35ca966a.tar.gz
test: demo for issue 7695
Cgo writes C function declarations pretending every arg is a pointer. If the C function is deferred, it does not inhibit stack copying on split. The stack copying code believes the C declaration, possibly misinterpreting integers as pointers. Probably the right fix for Go 1.3 is to make deferred C functions inhibit stack copying. For Go 1.4 and beyond we probably need to make cgo generate Go code for 6g here, not C code for 6c. Update issue 7695 LGTM=khr R=khr CC=golang-codereviews https://codereview.appspot.com/83820043
Diffstat (limited to 'misc')
-rw-r--r--misc/cgo/test/backdoor/backdoor.go1
-rw-r--r--misc/cgo/test/backdoor/runtime.c7
-rw-r--r--misc/cgo/test/issue7695_test.go27
3 files changed, 35 insertions, 0 deletions
diff --git a/misc/cgo/test/backdoor/backdoor.go b/misc/cgo/test/backdoor/backdoor.go
index efe4f01f4..7398772bd 100644
--- a/misc/cgo/test/backdoor/backdoor.go
+++ b/misc/cgo/test/backdoor/backdoor.go
@@ -5,3 +5,4 @@
package backdoor
func LockedOSThread() bool // in runtime.c
+func Issue7695(x1, x2, x3, x4, x5, x6, x7, x8 uintptr)
diff --git a/misc/cgo/test/backdoor/runtime.c b/misc/cgo/test/backdoor/runtime.c
index 194a9c8e4..7e6b44872 100644
--- a/misc/cgo/test/backdoor/runtime.c
+++ b/misc/cgo/test/backdoor/runtime.c
@@ -23,3 +23,10 @@ void
b = runtime·lockedOSThread();
FLUSH(&b);
}
+
+// This is what a cgo-compiled stub declaration looks like.
+void
+·Issue7695(struct{void *y[8*sizeof(void*)];}p)
+{
+ USED(p);
+}
diff --git a/misc/cgo/test/issue7695_test.go b/misc/cgo/test/issue7695_test.go
new file mode 100644
index 000000000..4bd6f8e73
--- /dev/null
+++ b/misc/cgo/test/issue7695_test.go
@@ -0,0 +1,27 @@
+// Copyright 2014 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.
+
+// Demo of deferred C function with untrue prototype
+// breaking stack copying. See golang.org/issue/7695.
+
+package cgotest
+
+import (
+ "testing"
+
+ "./backdoor"
+)
+
+func TestIssue7695(t *testing.T) {
+ defer backdoor.Issue7695(1, 0, 2, 0, 0, 3, 0, 4)
+ recurse(100)
+}
+
+func recurse(n int) {
+ var x [128]int
+ n += x[0]
+ if n > 0 {
+ recurse(n - 1)
+ }
+}