windows/amd64: race detector triggers checkptr failure
Hi @JasonTashtego, I hope you're doing well.
Copying from sqlite#62 (closed):
C:\Users\0xjnml\go\src\github.com\zombiezen\go-sqlite>go clean -testcache
C:\Users\0xjnml\go\src\github.com\zombiezen\go-sqlite>go env GOOS GOARCH
windows
amd64
C:\Users\0xjnml\go\src\github.com\zombiezen\go-sqlite>go test
PASS
ok zombiezen.com/go/sqlite 0.469s
C:\Users\0xjnml\go\src\github.com\zombiezen\go-sqlite>go test -race
fatal error: checkptr: pointer arithmetic computed bad pointer value
goroutine 1 [running, locked to thread]:
runtime.throw(0x13bd40b, 0x37)
C:/Program Files/Go/src/runtime/panic.go:1117 +0x79 fp=0xc000113300 sp=0xc0001132d0 pc=0x939f99
runtime.checkptrArithmetic(0x1, 0x0, 0x0, 0x0)
C:/Program Files/Go/src/runtime/checkptr.go:26 +0xd7 fp=0xc000113330 sp=0xc000113300 pc=0x904e17
modernc.org/libc.newFile(0x0, 0xc000000000, 0xc000163500)
C:/Users/0xjnml/go/pkg/mod/modernc.org/libc@v1.9.11/libc_windows.go:230 +0x19b fp=0xc000113370 sp=0xc000113330 pc=0xae807b
modernc.org/libc.init()
C:/Users/0xjnml/go/pkg/mod/modernc.org/libc@v1.9.11/libc.go:53 +0x5eea fp=0xc000113b98 sp=0xc000113370 pc=0xaf476a
runtime.doInit(0x16d7aa0)
C:/Program Files/Go/src/runtime/proc.go:6309 +0xfd fp=0xc000113ce8 sp=0xc000113b98 pc=0x94aa1d
runtime.doInit(0x16d52c0)
C:/Program Files/Go/src/runtime/proc.go:6286 +0x88 fp=0xc000113e38 sp=0xc000113ce8 pc=0x94a9a8
runtime.doInit(0x16d1f80)
C:/Program Files/Go/src/runtime/proc.go:6286 +0x88 fp=0xc000113f88 sp=0xc000113e38 pc=0x94a9a8
runtime.main()
C:/Program Files/Go/src/runtime/proc.go:208 +0x205 fp=0xc000113fe0 sp=0xc000113f88 pc=0x93c765
runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:1371 +0x1 fp=0xc000113fe8 sp=0xc000113fe0 pc=0x973c41
exit status 2
FAIL zombiezen.com/go/sqlite 0.099s
C:\Users\0xjnml\go\src\github.com\zombiezen\go-sqlite>go test -race -run 18
fatal error: checkptr: pointer arithmetic computed bad pointer value
goroutine 1 [running, locked to thread]:
runtime.throw(0x199d40b, 0x37)
C:/Program Files/Go/src/runtime/panic.go:1117 +0x79 fp=0xc000113300 sp=0xc0001132d0 pc=0xf19f99
runtime.checkptrArithmetic(0x1, 0x0, 0x0, 0x0)
C:/Program Files/Go/src/runtime/checkptr.go:26 +0xd7 fp=0xc000113330 sp=0xc000113300 pc=0xee4e17
modernc.org/libc.newFile(0x0, 0xc000000000, 0xc000165500)
C:/Users/0xjnml/go/pkg/mod/modernc.org/libc@v1.9.11/libc_windows.go:230 +0x19b fp=0xc000113370 sp=0xc000113330 pc=0x10c807b
modernc.org/libc.init()
C:/Users/0xjnml/go/pkg/mod/modernc.org/libc@v1.9.11/libc.go:53 +0x5eea fp=0xc000113b98 sp=0xc000113370 pc=0x10d476a
runtime.doInit(0x1cb7aa0)
C:/Program Files/Go/src/runtime/proc.go:6309 +0xfd fp=0xc000113ce8 sp=0xc000113b98 pc=0xf2aa1d
runtime.doInit(0x1cb52c0)
C:/Program Files/Go/src/runtime/proc.go:6286 +0x88 fp=0xc000113e38 sp=0xc000113ce8 pc=0xf2a9a8
runtime.doInit(0x1cb1f80)
C:/Program Files/Go/src/runtime/proc.go:6286 +0x88 fp=0xc000113f88 sp=0xc000113e38 pc=0xf2a9a8
runtime.main()
C:/Program Files/Go/src/runtime/proc.go:208 +0x205 fp=0xc000113fe0 sp=0xc000113f88 pc=0xf1c765
runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:1371 +0x1 fp=0xc000113fe8 sp=0xc000113fe0 pc=0xf53c41
exit status 2
FAIL zombiezen.com/go/sqlite 0.139s
C:\Users\0xjnml\go\src\github.com\zombiezen\go-sqlite>
The line in question seems to incorrectly convert an uintptr, holding a handle, to unsafe.Pointer and then back to uintptr.
I think we can just replace
f := addFile(h, fd)
return uintptr(unsafe.Pointer(f))
with
return addFile(h, fd)
and similarly two more times below, but I wanted to check with you if I'm possibly missing something.
Please take a look, thank you.