Re: [PATCH] checkpatch: prefer = {} initializations to = {0}
From: Christophe JAILLET <hidden>
Date: 2021-08-14 20:20:36
Also in:
lkml
Le 14/08/2021 à 16:52, Al Viro a écrit :
On Sat, Aug 14, 2021 at 03:59:22PM +0200, Christophe JAILLET wrote:quoted
quoted
+# prefer = {}; to = {0}; + if ($line =~ /= \{ *0 *\}/) { + WARN("ZERO_INITIALIZER", + "= {} is preferred over = {0}\n" . $herecurr);Sigh... "is preferred over" by whom? Use the active voice, would you?quoted
[1] and [2] state that {} and {0} don't have the same effect. So if correct, this is not only a matter of style. When testing with gcc 10.3.0, I arrived at the conclusion that both {} and {0} HAVE the same behavior (i.e the whole structure and included structures are completely zeroed) and I don't have a C standard to check what the rules are. gcc online doc didn't help me either.http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf, but empty initializer-list is gccism anyway. Section 6.7.8 is the one to look through there.quoted
Can someone provide some rational or compiler output that confirms that {} and {0} are not the same?Easily: compare int x[] = {0}; and int x[] = {}; For more obscure example, int x = {0}; is valid, if pointless, but int x = {}; will be rejected even by gcc. Incidentally, do *NOT* assume that initializer will do anything with padding in a structure, no matter how you spell it. Neither {} nor {0} nor explicit initializer for each member of struct do anything to the padding. memset() does, but anything short of that leaves the padding contents unspecified.
Thanks for the explanations and exemples.
IIUC, code like [1] may leak some data (1 char) because of the layout of
'struct atyclk' and we have the erroneous feeling that it is fully
initialized, because of the "{ 0 }".
Correct?
CJ
[1]:
https://elixir.bootlin.com/linux/v5.14-rc5/source/drivers/video/fbdev/aty/atyfb_base.c#L1859