Antti Haapala added the comment:

To Charles first: "Gives back a sizeof of 8 on Windows and 10 on Linux. The 
inconsistency makes it difficult to have code work cross-platform." 

The bitfields in particular and ctypes in general have *never* been meant to be 
cross-platform - instead they just must need to match the particular C compiler 
behaviour of the platform, thus the use of these for cross platform work is 
ill-advised - perhaps you should just use the struct module instead.

However, that said, on Linux, sizeof these structures - packed or not - do not 
match the output from GCC; unpacked one has sizeof 12 and packed 10 on my 
Python 3.5, but they're both 8 bytes on GCC. This is a real bug.

GCC says that the bitfield behaviour is: 
https://gcc.gnu.org/onlinedocs/gcc-4.9.1/gcc/Structures-unions-enumerations-and-bit-fields-implementation.html

Whether a bit-field can straddle a storage-unit boundary (C90 6.5.2.1, C99 and 
C11 6.7.2.1).

Determined by ABI.
The order of allocation of bit-fields within a unit (C90 6.5.2.1, C99 and C11 
6.7.2.1).

Determined by ABI.
The alignment of non-bit-field members of structures (C90 6.5.2.1, C99 and C11 
6.7.2.1).

Determined by ABI. 

Thus, the actual behaviour need to be checked from the API documentation of the 
relevant platform. However - at least for unpacked structs - the x86-64 
behaviour is that a bitfield may not cross an addressable unit.

----------
nosy: +ztane
title: Ctypes Packing Incorrectly - Linux -> Ctypes Packing Bitfields 
Incorrectly - Linux

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue29753>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to