• 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: default avatarMatthew Dempsky <mdempsky@google.com>
    a16954b8
cgocall.go 19.5 KB