Skip to content

Commit

Permalink
cmd/cgo: throw if C.malloc returns nil
Browse files Browse the repository at this point in the history
Change-Id: If7740ac7b6c4190db5a1ab4100d12cf16dc79c84
Reviewed-on: https://go-review.googlesource.com/31768
Run-TryBot: Ian Lance Taylor <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Russ Cox <[email protected]>
  • Loading branch information
ianlancetaylor committed Oct 25, 2016
1 parent 643c6b3 commit b4ce38e
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 0 deletions.
23 changes: 23 additions & 0 deletions misc/cgo/errors/malloc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Copyright 2016 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.

// Test that C.malloc does not return nil.

package main

// #include <stdlib.h>
import "C"

import (
"fmt"
)

func main() {
p := C.malloc(C.size_t(^uintptr(0)))
if p == nil {
fmt.Println("malloc: C.malloc returned nil")
// Just exit normally--the test script expects this
// program to crash, so exiting normally indicates failure.
}
}
10 changes: 10 additions & 0 deletions misc/cgo/errors/test.bash
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,15 @@ if ! go run ptr.go; then
exit 1
fi

# The malloc.go test should crash.
rm -f malloc.out
if go run malloc.go >malloc.out 2>&1; then
echo "`go run malloc.go` succeeded unexpectedly"
cat malloc.out
rm -f malloc.out
exit 1
fi
rm -f malloc.out

rm -rf errs _obj
exit 0
6 changes: 6 additions & 0 deletions src/cmd/cgo/out.go
Original file line number Diff line number Diff line change
Expand Up @@ -1463,9 +1463,15 @@ const cMallocDefGo = `
var __cgofn__cgoPREFIX_Cfunc__Cmalloc byte
var _cgoPREFIX_Cfunc__Cmalloc = unsafe.Pointer(&__cgofn__cgoPREFIX_Cfunc__Cmalloc)
//go:linkname runtime_throw runtime.throw
func runtime_throw(string)
//go:cgo_unsafe_args
func _cgo_cmalloc(p0 uint64) (r1 unsafe.Pointer) {
_cgo_runtime_cgocall(_cgoPREFIX_Cfunc__Cmalloc, uintptr(unsafe.Pointer(&p0)))
if r1 == nil {
runtime_throw("runtime: C malloc failed")
}
return
}
`
Expand Down

0 comments on commit b4ce38e

Please sign in to comment.