On 28/05/2020 17:27, bugzilla-daemon@xxxxxxxxxxxxxxxxxxx wrote: > https://bugzilla.kernel.org/show_bug.cgi?id=207959 > > Bug ID: 207959 > Summary: Don't warn about the universal zero initializer for a > structure with the 'designated_init' attribute. > Product: Tools > Version: unspecified > Kernel Version: Sparse 0.6.1 (Debian: 0.6.1-2+b1) > Hardware: All > OS: Linux > Tree: Mainline > Status: NEW > Severity: enhancement > Priority: P1 > Component: Sparse > Assignee: tools_sparse@xxxxxxxxxxxxxxxxxxxxxx > Reporter: AsDaGo@xxxxxxxxxx > Regression: No > > Created attachment 289383 > --> https://bugzilla.kernel.org/attachment.cgi?id=289383&action=edit > A test program illustrating the issue > > I reported this bug to GCC here: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95379 > > They don't want to diverge GCC's behavior from Sparse's, but I think this would > be a useful feature, and I think it should be implemented in Sparse as well. > Below is my bug report to GCC. > >> When the 'designated_init' attribute is used on a structure type, GCC warns >> when an instance of that structure is initialized with '{ 0 }'. I think GCC >> should make an exception for this, since '{ 0 }' is often used to initialize >> all fields of a structure to 0, and it does not depend on the internal >> structure of the structure type. >> >> If '{ }' is used to initialize the structure, GCC does not warn. However, >> although '{ }' seems to initialize the structure to zero in GCC, I'm not >> sure if it's as portable as '{ 0 }' (and it's less readable, IMO). I think >> '{ }' is part of the C++ standard; does anyone know if it's part of C too? No this is not standard C: $ cat -n junk1.c 1 #include <stdio.h> 2 3 int main (int argc, char *argv[]) 4 { 5 struct { char *f; int i; } fred = {}; 6 printf("fred.f %p, fred.i %d\n", fred.f, fred.i); 7 return 0; 8 } $ gcc -pedantic -o junk1 junk1.c junk1.c: In function ‘main’: junk1.c:5:36: warning: ISO C forbids empty initializer braces [-Wpedantic] struct { char *f; int i; } fred = {}; ^ $ ./junk1 fred.f (nil), fred.i 0 $ ... and you get similar results with clang: $ clang -pedantic -o junk1 junk1.c junk1.c:5:36: warning: use of GNU empty initializer extension [-Wgnu-empty-initializer] struct { char *f; int i; } fred = {}; ^ junk1.c:6:35: warning: format specifies type 'void *' but the argument has type 'char *' [-Wformat-pedantic] printf("fred.f %p, fred.i %d\n", fred.f, fred.i); ~~ ^~~~~~ %s 2 warnings generated. $ ATB, Ramsay Jones