Thread (18 messages) 18 messages, 7 authors, 2021-08-16

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

From: Al Viro <viro@zeniv.linux.org.uk>
Date: 2021-08-14 14:57:15
Also in: lkml

On Sat, Aug 14, 2021 at 03:59:22PM +0200, Christophe JAILLET wrote:
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?
[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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help