Re: [PATCH] checkpatch: prefer = {} initializations to = {0}

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Kernel Development]     [Kernel Announce]     [Kernel Newbies]     [Linux Networking Development]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Device Mapper]

  Powered by Linux