Re: [PATCH v3] kernel.h: Skip single-eval logic on literals in min()/max()

From: Linus Torvalds
Date: Sat Mar 10 2018 - 11:31:00 EST


On Sat, Mar 10, 2018 at 7:33 AM, Kees Cook <keescook@xxxxxxxxxxxx> wrote:
>
> Alright, I'm giving up on fixing max(). I'll go back to STACK_MAX() or
> some other name for the simple macro. Bleh.

Oh, and I'm starting to see the real problem.

It's not that our current "min/max()" are broiken. It's that "-Wvla" is garbage.

Lookie here:

int array[(1,2)];

results in gcc saying

warning: ISO C90 forbids variable length array âarrayâ [-Wvla]
int array[(1,2)];
^~~

and that error message - and the name of the flag - is obviously pure garbage.

What is *actually* going on is that ISO C90 requires an array size to
be not a constant value, but a constant *expression*. Those are two
different things.

A constant expression has little to do with "compile-time constant".
It's a more restricted form of it, and has actual syntax requirements.
A comma expression is not a constant expression, for example, which
was why I tested this.

So "-Wvla" is garbage, with a misleading name, and a misleading
warning string. It has nothing to do with "variable length" and
whether the compiler can figure it out at build time, and everything
to do with a _syntax_ rule.

Linus