]> git.dujemihanovic.xyz Git - linux.git/commit
minmax: fix up min3() and max3() too
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 30 Jul 2024 22:44:16 +0000 (15:44 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 31 Jul 2024 16:57:18 +0000 (09:57 -0700)
commit21b136cc63d2a9ddd60d4699552b69c214b32964
treeb1fe043c07e0b7b42ad5dbc8c1127f3ded2c0ac6
parente4fc196f5ba36eb7b9758cf2c73df49a44199895
minmax: fix up min3() and max3() too

David Laight pointed out that we should deal with the min3() and max3()
mess too, which still does excessive expansion.

And our current macros are actually rather broken.

In particular, the macros did this:

  #define min3(x, y, z) min((typeof(x))min(x, y), z)
  #define max3(x, y, z) max((typeof(x))max(x, y), z)

and that not only is a nested expansion of possibly very complex
arguments with all that involves, the typing with that "typeof()" cast
is completely wrong.

For example, imagine what happens in max3() if 'x' happens to be a
'unsigned char', but 'y' and 'z' are 'unsigned long'.  The types are
compatible, and there's no warning - but the result is just random
garbage.

No, I don't think we've ever hit that issue in practice, but since we
now have sane infrastructure for doing this right, let's just use it.
It fixes any excessive expansion, and also avoids these kinds of broken
type issues.

Requested-by: David Laight <David.Laight@aculab.com>
Acked-by: Arnd Bergmann <arnd@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/minmax.h