Description
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?