go: gccgo: cgo: false positive cgo argument has Go pointer to Go pointer
What version of Go are you using (go version
)?
go version go1.9 gccgo (GCC) 8.0.0 20180108 (experimental) linux/amd64
Description
The following code exists in CockroachDB: https://github.com/cockroachdb/cockroach/blob/4e6ec545cc65dc0051a797996e9642b4b5e8bdc2/pkg/storage/engine/rocksdb.go#L447-L450
Said plainly, initialization across cgo is done by passing a Go **C.DBEngine
which points to nil
to a C function that allocates and sets the pointed-to *C.DBEngine
. This code works perfectly when compiled with gc, but produces this error when compiled with gccgo:
panic: runtime error: cgo argument has Go pointer to Go pointer
goroutine 24 [running]:
panic
../../../src/libgo/go/runtime/panic.go:543
github_com_cockroachdb_cockroach_pkg_storage_engine._cgoCheckPointer
/usr/local/home/tduberstein/go/src/github.com/cockroachdb/cockroach/pkg/storage/engine/cgo-c-prolog-gccgo:74
engine.$nested21
/usr/local/home/tduberstein/go/src/github.com/cockroachdb/cockroach/pkg/storage/engine/rocksdb.go:584
github_com_cockroachdb_cockroach_pkg_storage_engine.open.pN59_github_com_cockroachdb_cockroach_pkg_storage_engine.RocksDB
/usr/local/home/tduberstein/go/src/github.com/cockroachdb/cockroach/pkg/storage/engine/rocksdb.go:584
engine.newMemRocksDB
/usr/local/home/tduberstein/go/src/github.com/cockroachdb/cockroach/pkg/storage/engine/rocksdb.go:518
github_com_cockroachdb_cockroach_pkg_storage_engine.NewInMem
/usr/local/home/tduberstein/go/src/github.com/cockroachdb/cockroach/pkg/storage/engine/in_mem.go:37
github_com_cockroachdb_cockroach_pkg_server.CreateEngines.pN50_github_com_cockroachdb_cockroach_pkg_server.Config
/usr/local/home/tduberstein/go/src/github.com/cockroachdb/cockroach/pkg/server/config.go:483
github_com_cockroachdb_cockroach_pkg_server.Start.pN50_github_com_cockroachdb_cockroach_pkg_server.Server
/usr/local/home/tduberstein/go/src/github.com/cockroachdb/cockroach/pkg/server/server.go:858
cli.$nested72
/usr/local/home/tduberstein/go/src/github.com/cockroachdb/cockroach/pkg/cli/start.go:518
cli.$nested70
/usr/local/home/tduberstein/go/src/github.com/cockroachdb/cockroach/pkg/cli/start.go:500
created by cli.runStart
/usr/local/home/tduberstein/go/src/github.com/cockroachdb/cockroach/pkg/cli/start.go:474 +3255
According to https://golang.org/cmd/cgo/#hdr-Passing_pointers:
Go code may pass a Go pointer to C provided the Go memory to which it points does not contain any Go pointers.
It’s not exactly clear if nil Go pointers are permitted, but the gc implementation certainly permits it. Perhaps gccgo is missing a null check?
About this issue
- Original URL
- State: closed
- Created 6 years ago
- Comments: 44 (43 by maintainers)
Commits related to this issue
- runtime: correct runtime structfield type to match reflect The offset field in structfield has changed to offsetAnon, and now requires a shift to get the actual offset value. ... — committed to gcc-mirror/gcc by deleted user 6 years ago
- runtime: correct runtime structfield type to match reflect The offset field in structfield has changed to offsetAnon, and now requires a shift to get the actual offset value. Fix... — committed to WonderfulToolchain/gcc-ia16 by deleted user 6 years ago
Sent https://golang.org/cl/92275. Thanks for your patience.