New compiler warnings in buildfarm - Mailing list pgsql-hackers

From Tom Lane
Subject New compiler warnings in buildfarm
Date
Msg-id 3074306.1722356349@sss.pgh.pa.us
Whole thread Raw
Responses Re: New compiler warnings in buildfarm
Re: New compiler warnings in buildfarm
List pgsql-hackers
Sometime in the last month or so, flaviventris's bleeding-edge
version of gcc has started whining[1] about truncation of a
string literal's implicit trailing '\0' in contexts like this:

../pgsql/src/backend/commands/copyto.c:106:41: warning: initializer-string for array of 'char' is too long
[-Wunterminated-string-initialization]
  106 | static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0";
      |                                         ^~~~~~~~~~~~~~~~~~~~

../pgsql/src/backend/utils/adt/numutils.c:29:1: warning: initializer-string for array of 'char' is too long
[-Wunterminated-string-initialization]
   29 | "00" "01" "02" "03" "04" "05" "06" "07" "08" "09"
      | ^~~~

Presumably this'll appear in less-bleeding-edge releases in a
few months' time.

In the BinarySignature case, we could silence it in at least two ways.
We could remove the explicit trailing \0 and rely on the implicit one:

-static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0";
+static const char BinarySignature[11] = "PGCOPY\n\377\r\n";

Or just drop the unnecessary array length specification:

-static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0";
+static const char BinarySignature[] = "PGCOPY\n\377\r\n\0";

Or we could do both things, but that feels perhaps too magic.

In the numutils.c case, I think that dropping the array length
spec is the only reasonable fix, since the last desired character
isn't a \0:

-static const char DIGIT_TABLE[200] =
+static const char DIGIT_TABLE[] =
 "00" "01" "02" "03" "04" "05" "06" "07" "08" "09"
 ...
 "90" "91" "92" "93" "94" "95" "96" "97" "98" "99";

There is one more similar complaint:

../pgsql/contrib/fuzzystrmatch/daitch_mokotoff.c:92:20: warning: initializer-string for array of 'char' is too long
[-Wunterminated-string-initialization]
   92 |         .soundex = "000000",            /* Six digits */
      |                    ^~~~~~~~

Here, the struct field is declared

    char        soundex[DM_CODE_DIGITS];    /* Soundex code */

and we probably don't want to mess with that.  However, elsewhere in
the same struct initialization I see

    char        prev_code_digits[2];
    char        next_code_digits[2];

...

    .prev_code_digits = {'\0', '\0'},
    .next_code_digits = {'\0', '\0'},

and that's *not* drawing a warning.  So the most plausible fix
seems to be

-         .soundex = "000000",            /* Six digits */
+         .soundex = {'0', '0', '0', '0', '0', '0'},  /* Six digits */

(In principle, we could fix the COPY and numutils cases the same
way, but I don't care for the readability loss that'd entail.)

Preferences, other suggestions?

            regards, tom lane

[1] https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=flaviventris&dt=2024-07-30%2012%3A29%3A41&stg=build



pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: Minor refactorings to eliminate some static buffers
Next
From: Robert Haas
Date:
Subject: Re: Suboptimal spinlock code due to volatile