>>> from ctypes import *
>>> import ctypes.util
>>> libc = CDLL("libc.so.6")
>>> libc.printf("%c\n", 104)
h
2
>>> libc.islower(104) # Works fine
512
>>> libc.islower.restype = c_bool # But when i do this...
>>> libc.islower(104)
False
>>> c_bool(512)
c_bool(True)
personally, i think 'h' is lower case..
Is this a bug in ctypes, or am I doing something wrong?
restype
is not there just to tell the Python output type, but, most importantly, to tell what is the C type to expect, and thus how to marshal it. islower
returns an int
, which is typically 4 bytes wide; if you say it returns a bool
(which is normally 1 byte) you are breaking the expectations of the marshaling code.
This time you got an incorrect result (probably because on your platform the return code goes in a register, and so it's just taking the lower 8 bits of it), on another platform or for another type this could easily break the stack, and thus crash your process.
So: don't do that. Always respect the C API types and convert after the call.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With