[lttng-dev] [PATCH barectf 1/1] Fix: bitfield: shift undefined/implementation defined behaviors

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Wed May 15 17:53:19 EDT 2019


----- On May 14, 2019, at 4:42 PM, Mathieu Desnoyers mathieu.desnoyers at efficios.com wrote:

[...]
> 
> #define _$prefix$bt_bitfield_write_be(_ptr, type, _start, _length, _vtype, _v)
> \\
> do {									\\
> -	_vtype __v = (_v);					\\
> +	_vtype __v = (_v);						\\
> 	type *__ptr = CAST_PTR(type *, _ptr);				\\
> 	unsigned long __start = (_start), __length = (_length);		\\
> 	type mask, cmask;						\\
> @@ -740,15 +859,15 @@ do {									\\
> 									\\
> 	/* Trim v high bits */						\\
> 	if (__length < sizeof(__v) * CHAR_BIT)				\\
> -		__v &= ~((~(_vtype) 0) << __length);			\\
> +		__v &= _$prefix$bt_make_mask(_vtype, __length);		\\
> 									\\
> 	/* We can now append v with a simple "or", shift it piece-wise */ \\
> 	this_unit = end_unit - 1;					\\
> 	if (start_unit == end_unit - 1) {				\\
> -		mask = ~((~(type) 0) << ((ts - (end % ts)) % ts));	\\
> +		mask = _$prefix$bt_make_mask(type, (ts - (end % ts)) % ts); \\
> 		if (__start % ts)					\\
> -			mask |= (~((type) 0)) << (ts - (__start % ts));	\\
> -		cmask = (type) __v << ((ts - (end % ts)) % ts);		\\
> +			mask |= _$prefix$bt_make_mask_complement(type, ts - (__start % ts)); \\
> +		cmask = _$prefix$bt_lshift(type, (type) (__v), (ts - (end % ts)) % ts); \\
> 		cmask &= ~mask;						\\
> 		__ptr[this_unit] &= mask;				\\
> 		__ptr[this_unit] |= cmask;				\\
> @@ -756,8 +875,8 @@ do {									\\
> 	}								\\
> 	if (end % ts) {							\\
> 		cshift = end % ts;					\\
> -		mask = ~((~(type) 0) << (ts - cshift));			\\
> -		cmask = (type) __v << (ts - cshift);			\\
> +		mask = _$prefix$bt_make_mask(type, ts - cshift);	\\
> +		cmask = _$prefix$bt_lshift(type, (type) (__v), ts - cshift); \\
> 		cmask &= ~mask;						\\
> 		__ptr[this_unit] &= mask;				\\
> 		__ptr[this_unit] |= cmask;				\\
> @@ -771,7 +890,7 @@ do {									\\
> 		end -= ts;						\\
> 	}								\\
> 	if (__start % ts) {						\\
> -		mask = (~(type) 0) << (ts - (__start % ts));		\\
> +		mask = _$prefix$bt_make_mask(type, ts - (__start % ts)); \\

Should be:

+               mask = _$prefix$bt_make_mask_complement(type, ts - (__start % ts)); \\

Will send an updated patch.

Mathieu

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


More information about the lttng-dev mailing list