diff options
author | Russ Cox <rsc@golang.org> | 2014-04-16 23:06:37 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-04-16 23:06:37 -0400 |
commit | 8ab1ac597d871988cfdbe79050c66c9a35ca966a (patch) | |
tree | 7265598df8ac46510ea199ab6bbf950781915d58 /misc | |
parent | 254922ddce9930f7a307e055ccecbdc7078bc740 (diff) | |
download | go-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.go | 1 | ||||
-rw-r--r-- | misc/cgo/test/backdoor/runtime.c | 7 | ||||
-rw-r--r-- | misc/cgo/test/issue7695_test.go | 27 |
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) + } +} |