Subject: New compiler warnings in buildfarm

From: Tom Lane <[email-masked]>
Date: Tue, 30 Jul 2024 12:19:09 -0400

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

---

From: Ranier Vilela <[email-masked]>
Date: Tue, 30 Jul 2024 13:56:16 -0300

Em ter., 30 de jul. de 2024 às 13:19, Tom Lane <[email-masked]> escreveu:

> ../pgsql/src/backend/commands/copyto.c:106:41: warning: initializer-string
> for array of 'char' is too long [-Wunterminated-string-initialization]
> ../pgsql/src/backend/utils/adt/numutils.c:29:1: warning:
> initializer-string for array of 'char' is too long
> [-Wunterminated-string-initialization]
+1 for dropping the length specification.
The trailing \0 the compiler will automatically fill in.
Note this came from copyfromparse.c, who also have the same problem.

best regards,
Ranier Vilela