[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20220615164655.GC25951@gate.crashing.org>
Date: Wed, 15 Jun 2022 11:46:55 -0500
From: Segher Boessenkool <segher@...nel.crashing.org>
To: Alexander Potapenko <glider@...gle.com>
Cc: Linus Torvalds <torvalds@...ux-foundation.org>,
Evgenii Stepanov <eugenis@...gle.com>,
Kees Cook <keescook@...omium.org>,
Marco Elver <elver@...gle.com>,
Nathan Chancellor <nathan@...nel.org>,
Nick Desaulniers <ndesaulniers@...gle.com>,
Thomas Gleixner <tglx@...utronix.de>,
Vitaly Buka <vitalybuka@...gle.com>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
linux-toolchains <linux-toolchains@...r.kernel.org>
Subject: Re: [PATCH] [RFC] Initialization of unused function parameters
Hi!
On Wed, Jun 15, 2022 at 10:30:17AM +0200, Alexander Potapenko wrote:
> On Tue, Jun 14, 2022 at 11:45 PM Segher Boessenkool
> <segher@...nel.crashing.org> wrote:
> > Since C11, lvalue conversion of an automatic variable that does not have
> > its address taken is explicitly undefined behaviour (6.3.2.1/2). So in
> > function "p", both where "c" and where "size" are passed causes UB (so
> > that executing "p" always causes UB btw).
>
> Thanks for this reference to the standard. I've received another one
> off-list, which lets the variables be address-taken:
>
> 6.2.4/6: "If an initialization is specified for the object, it is
> performed each time the declaration or compound literal is reached in
> the execution of the block; otherwise, the value becomes indeterminate
> each time the declaration is reached."
> 3.19.2/1: "indeterminate value: either an unspecified value or a trap
> representation"
> 6.2.6.1/5: "Certain object representations need not represent a value
> of the object type. If the stored value of an object has such a
> representation and is read by an lvalue expression that does not have
> character type, the behavior is undefined. If such a representation is
> produced by a side effect that modifies all or any part of the object
> by an lvalue expression that does not have character type, the
> behavior is undefined. [Footnote: Thus, an automatic variable can be
> initialized to a trap representation without causing undefined
> behavior, but the value of the variable cannot be used until a proper
> value is stored in it.] Such a representation is called a trap
> representation."
That only affects types that have trap representations though, which
importantly explicitly does not include unsigned types without padding
bits, and unsigned char always.
Some people (on the standards committee) think all uninitialised uses
should be UB. And some think not. But since C11 we have this new
explicit UB for automatic variables that don't have their address taken.
(The background of that is the Itanium NaT (not-a-thing) bit in its
registers; without this new clause compilers for Itanium needed to
initialise many things that they now do not, with some readings of the
standard anyway :-) )
> > GCC does not warn, it has already optimised the code to what you expect
> > by the time this warning is done. If you use -fno-inline it does warn
> > for both "c" and "size" (via -Wmaybe-uninitialized).
> >
> > But it is still UB! All bets are off, no compiler can do any correct
> > translation of your program, since there *is none*.
>
> Then it makes sense for us to report non-trivial cases where
> uninitialized values are actually passed to functions.
Yes, and IMO it makes sense to report this to compilers as well, if they
do not yet warn for some simple cases.
Cheers,
Segher
Powered by blists - more mailing lists