Messages in this thread | | | From | "Peter T. Breuer" <> | Subject | Re: [IDEA+RFC] Possible solution for min()/max() war | Date | Fri, 31 Aug 2001 01:27:57 +0200 (MET DST) |
| |
"A month of sundays ago Patrick J. LoPresti wrote:" > This is a MUCH nicer solution. max() is a well-defined mathematical > concept; it is simply the larger of its two arguments, period. It is > C's *promotion* rules that kill you, especially signed->unsigned > promotion. So just forbid them, at least when they implicit. > > You can argue about whether the "differing sizes" case should be a > BUG(), since the output will still be mathematically correct. It
To give you all something definite to look at, here's some test code:
// standard good 'ol faithful version #define __MIN(x,y) ({\ typeof(x) _x = x; \ typeof(y) _y = y; \ _x < _y ? _x : _y ; \ })
// possible implemetation with type sanity checks - alter to taste #define MIN(x,y) ({\ const typeof(x) _x = ~(typeof(x))0; \ const typeof(y) _y = ~(typeof(y))0; \ void MIN_BUG(); \ if (sizeof(_x) != sizeof(_y)) \ MIN_BUG(); \ if ((_x > 0 && _y < 0) || (_x < 0 && _y > 0)) \ MIN_BUG(); \ __MIN(x,y); \ })
// test code that compiles with no complaints with -O1 -Wall int main() { unsigned i = 1; unsigned j = -2; return MIN(i,j); }
// test code that complains at link time (in this version) with .. // gcc -o test -O1 -Wall test.c // /tmp/cczJbwv5.o: In function `main': // /tmp/cczJbwv5.o(.text+0x7): undefined reference to `MIN_BUG' // collect2: ld returned 1 exit status // int main() { unsigned i = 1; signed j = -2; return MIN(i,j); }
> depends on how often it is useful to compare (say) unsigned chars > against ints, and on whether the compiler warns about cases where you > try to stuff the return value into a too-small container. I bet that > just forbidding signed->unsigned promotion would be enough.
Possibly. I have little clue as to the real extent of the problem.
Peter - 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/
| |