• Ian Lance Taylor's avatar
    cmd/cgo: always use a function literal for pointer checking · a16954b8
    Ian Lance Taylor authored
    The pointer checking code needs to know the exact type of the parameter
    expected by the C function, so that it can use a type assertion to
    convert the empty interface returned by cgoCheckPointer to the correct
    type. Previously this was done by using a type conversion, but that
    meant that the code accepted arguments that were convertible to the
    parameter type, rather than arguments that were assignable as in a
    normal function call. In other words, some code that should not have
    passed type checking was accepted.
    
    This CL changes cgo to always use a function literal for pointer
    checking. Now the argument is passed to the function literal, which has
    the correct argument type, so type checking is performed just as for a
    function call as it should be.
    
    Since we now always use a function literal, simplify the checking code
    to run as a statement by itself. It now no longer needs to return a
    value, and we no longer need a type assertion.
    
    This does have the cost of introducing another function call into any
    call to a C function that requires pointer checking, but the cost of the
    additional call should be minimal compared to the cost of pointer
    checking.
    
    Fixes #16591.
    
    Change-Id: I220165564cf69db9fd5f746532d7f977a5b2c989
    Reviewed-on: https://go-review.googlesource.com/31233
    Run-TryBot: Ian Lance Taylor <iant@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarMatthew Dempsky <mdempsky@google.com>
    a16954b8
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...