http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119

             Bug #: 53119
           Summary: -Wbraces wrongly warns about universal zero
                    initializer {0}
    Classification: Unclassified
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: bug...@aerifal.cx


In C, {0} is the universal zero initializer equivalent to C++'s {} (the latter
being invalid in C). It is necessary to use whenever you want a
zero-initialized object of a complete but conceptually-opaque or
implementation-defined type. The classic example in the C standard library is
mbstate_t:

mbstate_t state = { 0 }; /* correctly zero-initialized */

versus the common but nonportable:

mbstate_t state;
memset(&state, 0, sizeof state);

In this case, gcc -Wbraces (which is included in -Wall) actively discourages
the programmer from writing the correct form of the code by throwing ugly
warnings.

Note that if you want to eliminate warnings and write portable code, the *only*
way to zero-initialize an object like this is:

static const mbstate_t zero_state;
mbstate_t state = zero_state;

(i.e. creating an extra object of static storage duration to be implicitly zero
initialized).

The same reasoning applies to any structures provided by third-party libraries
which must be allocated by the calling application and zero-initialized, but
whose definitions are intended to be considered as opaque.

To fix the issue, GCC should simply special-case {0} as always-valid and
suppress warnings for it, while leaving in effect all other behaviors of
-Wbraces.

Reply via email to