[lttng-dev] [PATCH babeltrace v2] Fix: bitfield: left shift undefined behavior

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Wed May 8 13:01:44 EDT 2019


----- On May 8, 2019, at 12:08 PM, Simon Marchi simon.marchi at efficios.com wrote:

> On 2019-05-08 11:59 a.m., Mathieu Desnoyers wrote:
>> What compiler do you use, and which compilation flags ?
>> (it works here)
> 
> "gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0", which is the system compiler on
> Ubuntu 18.04.
> 
> I just built with
> 
>  ./configure 'CFLAGS=-g3 -O0 -fsanitize=address -Wall'
> 
> and got some failures, the first one being
> 
> not ok 8 - Writing and reading back 0xC07EBC7, signed
> #     Failed test (test_bitfield.c:run_test_signed() at line 224)
> # Failed reading value written "signed char"-wise, with start=0 and length=29.
> Read FFFFFFFFFFFFFFC7
> # 0xFFFFFFC7 0xFFFFFFEB 0x7 0xC 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
> 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
> 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
> 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
> 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
> 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
> 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
> 
> The test passes without the patch.  If you can't reproduce it easily, I can dig
> on my side.

it fails here too... the executable test-bitfield was renamed to test_bitfield
and I had an old tree with the prior executable. Will investigate.

Thanks,

Mathieu

> 
>>>>  
>>>>  /*
>>>>   * bt_bitfield_write - write integer to a bitfield in native endianness
>>>> @@ -108,15 +113,15 @@ do {									\
>>>>  									\
>>>>  	/* Trim v high bits */						\
>>>>  	if (__length < sizeof(__v) * CHAR_BIT)				\
>>>> -		__v &= ~((~(typeof(__v)) 0) << __length);		\
>>>> +		__v &= (typeof(__v)) ~(_bt_fill_mask(typeof(__v)) << __length); \
>>>
>>> Not a blocker, but this operation is done enough times that it might be worth
>>> giving it a name and make a macro for it.  It could help make this big macro
>>> more readable, and we could test it on its own if needed.
>>>
>>> /* Generate a mask of type `type` with the `length` least significant bits set.
>>> */
>>>
>>> #define _bt_make_mask(type, length) \
>>> 	((type) ~(_bt_fill_mask(type) << length))
>> 
>> Good point! Will do. Missing () around "length" though.
> 
> Right, and I should have mentioned I didn't actually test that macro, so handle
> with care!
> 
> Simon

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com


More information about the lttng-dev mailing list