]> Cypherpunks repositories - gostls13.git/commitdiff
test: demo for issue 7695
authorRuss Cox <rsc@golang.org>
Thu, 17 Apr 2014 03:06:37 +0000 (23:06 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 17 Apr 2014 03:06:37 +0000 (23:06 -0400)
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 #7695

LGTM=khr
R=khr
CC=golang-codereviews
https://golang.org/cl/83820043

misc/cgo/test/backdoor/backdoor.go
misc/cgo/test/backdoor/runtime.c
misc/cgo/test/issue7695_test.go [new file with mode: 0644]

index efe4f01f48d0d13830b0adaa6771913c45cc5ddf..7398772bd27484597c12b9a071d3bada1f629b9f 100644 (file)
@@ -5,3 +5,4 @@
 package backdoor
 
 func LockedOSThread() bool // in runtime.c
+func Issue7695(x1, x2, x3, x4, x5, x6, x7, x8 uintptr)
index 194a9c8e4e05aa7b8e36b7e410043ff402f0f115..7e6b448724a2d47a2bd9c7b7e50752a7cff9bc99 100644 (file)
@@ -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 (file)
index 0000000..4bd6f8e
--- /dev/null
@@ -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)
+       }
+}