[issue39030] Ctypes unions with bitfield members that do not share memory

2019-12-12 Thread Lewis Gaul


Change by Lewis Gaul :


--
nosy: +LewisGaul, belopolsky

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue39030] Ctypes unions with bitfield members that do not share memory

2019-12-12 Thread dankreso


New submission from dankreso :

I've found what looks like a corner case bug. Specifically, the behaviour that 
looks suspicious is when a ctypes union has bit field members, where the 
members have bit widths that are smaller than the size types:

class BitFieldUnion(Union):
_fields_ = [("a", c_uint32, 16), ("b", c_uint32, 16)]

buff = bytearray(4)

bitfield_union = BitFieldUnion.from_buffer(buff)
bitfield_union.a = 1
bitfield_union.b = 2

print("a is {}".format(bitfield_union.a)) # Prints "a is 1"
print("b is {}".format(bitfield_union.b)) # Prints "b is 2"
print("Buffer: {}".format(buff)) # Prints "Buffer: b'\x01\x00\x00\x00'".

(Example of this script can be found at https://rextester.com/XJFGAK37131. I've 
also tried it on my system which is Ubuntu 16.04.2 LTS with Python 3.6.)

Here I would expect both 'a' and 'b' to be set to 2, and for the buffer to look 
like '\x02\x00\x00\x00'. Here's the equivalent code in C which behaves as 
expected: https://rextester.com/HWDUMB56821.

If at least one of the bitwidths in the above example are changed from 16 to 
32, however, then 'a', 'b', and the buffer look as expected.

I've also attached some further examples of weird behaviour with unions with 
bitfield members - online version can be found at 
https://rextester.com/VZRB77320.

--
components: ctypes
files: bitfield_union.py
messages: 358300
nosy: dankreso
priority: normal
severity: normal
status: open
title: Ctypes unions with bitfield members that do not share memory
type: behavior
versions: Python 3.7
Added file: https://bugs.python.org/file48772/bitfield_union.py

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com