Re: [IDEA+RFC] Possible solution for min()/max() war

VDA (VDA@port.imtp.ilyichevsk.odessa.ua)
Thu, 6 Sep 2001 13:12:33 +0300


>>#define min2(a,b) ({ \
>> typeof(a) __a = (a); \
>> typeof(b) __b = (b); \
>> if( sizeof(a) != sizeof(b) ) BUG(); \
>> if( ~(typeof(a))0 > 0 && ~(typeof(b))0 < 0) BUG(); \
>> if( ~(typeof(a))0 < 0 && ~(typeof(b))0 > 0) BUG(); \
>> (__a < __b) ? __a : __b; \
>> })
>>
>>#define min3(type,a,b) ({ \
>> type __a = (a); \
>> type __b = (b); \
>> if( sizeof(a) > sizeof(type) ) BUG(); \
>> if( sizeof(b) > sizeof(type) ) BUG(); \
>> (__a < __b) ? __a : __b; \
>> })

RH> DesJardin's argument is finely crafted, but does this support it? Is min3
RH> intended to be what Linus was talking about?

My min2 requires types to be the same size and sign (after char/short->int
promotion - C always does that, seems we cannot control it - run
my test program and you'll see). If type is changed elsewhere later, min2
will barf - and this is good for preventing hard to track bugs.

Min3 is more permissive but requires programmer to indicate type
explicitly. However, it will bite you when you try convert long to
int, so it will catch some bugs too when someone decide to change
type of the variable.

Can you make better min? Another min addressing different type of bug?
It could be interesting. (We have similar issues with "less than" and
the like ops)

Don't know what Linus originally intended. I thought my two cents
might be useful.

RH> isn't what Linus was saying simply something like...

RH> #define min(type,a,b) (type) a < (type) b ? (type) a : (type) b;

Looks too dangerous to me. Double evaluation of a and b, no ()
around them...

RH> Looking at the trade-offs should account for the simplicity.

Ifs inside my min2 and min3 optimize out to nothing. Checked that.

-- 
Best regards,
VDA
mailto:VDA@port.imtp.ilyichevsk.odessa.ua
http://port.imtp.ilyichevsk.odessa.ua/vda/

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/