Le 14/08/2021 à 16:52, Al Viro a écrit :
On Sat, Aug 14, 2021 at 03:59:22PM +0200, Christophe JAILLET wrote:
+# 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?
[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.
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