ctypes from_param() truncating 64 bit pointers to 32 bit

Joakim Hove joakim.hove at gmail.com
Fri Feb 18 11:10:35 CET 2011


> Ok, then take care to post proper code next time. Details can be important,
> especially when asking about non-obvious problems.

Point taken - however the original context where the problem arose
consists of several massive libraries, which would be quite
impractical to post on a forum. The code I did post was proper in the
sense that it compiles and demonstrates the problem.

> Hmm, so you think that to call a C function, ctypes doesn't need to know
> what the exact signature is? That sounds a bit naive to me.

I fully agree that ctypes needs to know the type signature of the C
functions it wishes to call, my point is that this particular
information is not present in the shared library, and for that reason
we must set the input / return attributes of the ctypes functions
manually. In the Python code I do this like:

class BugTest:
   ....
   def from_param(self):
       return self.c_ptr

   def __init__(self)
       self.c_ptr =

lib_handle = ctypes.CDLL( "lib.so" )
...
func = getattr( lib_handle , "print_addr")

# Set the return type:
func.restype  = None

# Set the types of the arguments:
func.argtypes = [ BugTest ]

Now - the point is that if I omit the ctypes method from_param() and
instead set the argtype as:

func.argtypes = [ ctypes.c_void_p ]

And manually passing the internalized C - pointer to C things work as
I expect; I believe that the problem is somewhere along the
from_param() function path.

I did not make it really clear that if the original C allocation
points to memory in "32 bit region" everything works fine (as I
expected).

Thank you for your time.

Joakim




More information about the Python-list mailing list