PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

Started by Hans Buschmann20 days ago11 messageshackers
Jump to latest
#1Hans Buschmann
buschmann@nidsa.net

When compiling PG19 beta1 on Fedora 44 I got the following warning:

839/2360] Compiling C object src/backend/postgres_lib.a.p/optimizer_util_clauses.c.o
../src/backend/optimizer/util/clauses.c: In function ‘recheck_cast_function_args.isra’:
../src/backend/optimizer/util/clauses.c:5152:19: warning: ‘actual_arg_types’ may be used uninitialized [-Wmaybe-uninitialized]
5152 | rettype = enforce_generic_type_consistency(actual_arg_types,

This is still the same as reported in BUG 19485

/messages/by-id/19485-2b03231a775756f1@postgresql.org

configuration/full message attached

Hans Buschmann

Attachments:

compile_warning_19_b1_260604.txttext/plain; name=compile_warning_19_b1_260604.txtDownload
#2Nathan Bossart
nathandbossart@gmail.com
In reply to: Hans Buschmann (#1)
Re: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

On Thu, Jun 04, 2026 at 02:42:18PM +0000, Hans Buschmann wrote:

839/2360] Compiling C object src/backend/postgres_lib.a.p/optimizer_util_clauses.c.o
../src/backend/optimizer/util/clauses.c: In function ‘recheck_cast_function_args.isra’:
../src/backend/optimizer/util/clauses.c:5152:19: warning: ‘actual_arg_types’ may be used uninitialized [-Wmaybe-uninitialized]
5152 | rettype = enforce_generic_type_consistency(actual_arg_types,

This code is ~18 years old, so I'm dubious there's a real problem here.
Does something like this suppress the warning?

Oid actual_arg_types[FUNC_MAX_ARGS] = {InvalidOid};

--
nathan

#3Tristan Partin
tristan@partin.io
In reply to: Nathan Bossart (#2)
Re: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

On Thu Jun 4, 2026 at 3:08 PM UTC, Nathan Bossart wrote:

On Thu, Jun 04, 2026 at 02:42:18PM +0000, Hans Buschmann wrote:

839/2360] Compiling C object src/backend/postgres_lib.a.p/optimizer_util_clauses.c.o
../src/backend/optimizer/util/clauses.c: In function ‘recheck_cast_function_args.isra’:
../src/backend/optimizer/util/clauses.c:5152:19: warning: ‘actual_arg_types’ may be used uninitialized [-Wmaybe-uninitialized]
5152 | rettype = enforce_generic_type_consistency(actual_arg_types,

This code is ~18 years old, so I'm dubious there's a real problem here.

Pulling the code into the email:

static void
recheck_cast_function_args(List *args, Oid result_type,
Oid *proargtypes, int pronargs,
HeapTuple func_tuple)
{
[...]
Oid actual_arg_types[FUNC_MAX_ARGS];
[...]
ListCell *lc;

if (list_length(args) > FUNC_MAX_ARGS)
elog(ERROR, "too many function arguments");
nargs = 0;
foreach(lc, args)
{
actual_arg_types[nargs++] = exprType((Node *) lfirst(lc));
}
Assert(nargs == pronargs);
memcpy(declared_arg_types, proargtypes, pronargs * sizeof(Oid));
rettype = enforce_generic_type_consistency(actual_arg_types,

GCC seems right to complain. A NIL list or a list with a length of 0
would initialize none of the elements in actual_arg_types. However, is
this a problem in actuality? No, because we use nargs to make sure we
don't access uninitialized memory in
enforce_generic_type_consistency(). Maybe GCC's static analysis is a lot
smarter than I give it credit for though, and this is a compiler bug in
the newer version.

Does something like this suppress the warning?

Oid actual_arg_types[FUNC_MAX_ARGS] = {InvalidOid};

I could not reproduce on 16.1.0 via nixpkgs or 16.1.1 on Fedora 44
(which is strange), but theoretically this would work.

--
Tristan Partin
PostgreSQL Contributors Team
AWS (https://aws.amazon.com)

#4Hans Buschmann
buschmann@nidsa.net
In reply to: Tristan Partin (#3)
AW: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

I only want to add that my system is current up to date (dnf check-update --refresh), The GCC is installed from Fedora during the normal system upgrade process to Fedora 44.

root@fedora ~]# dnf list --installed gcc*
Installed packages (available for reinstall, available for upgrade)

gcc.x86_64 16.1.1-2.fc44 updates
gcc-c++.x86_64 16.1.1-2.fc44 updates
gcc-plugin-annobin.x86_64 16.1.1-2.fc44 updates

As seen in the Bug report, this is not specific to PG 19 beta1.

My guess is that this warning occurs on all supported versions of postgres (tested with 18.4 in the BUG report), so backpatching could be necessary.

Hans Buschmann

________________________________
Von: Tristan Partin <tristan@partin.io>
Gesendet: Freitag, 5. Juni 2026 00:24
An: Nathan Bossart
Cc: pgsql-hackers@postgresql.org; Hans Buschmann
Betreff: Re: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

On Thu Jun 4, 2026 at 3:08 PM UTC, Nathan Bossart wrote:

On Thu, Jun 04, 2026 at 02:42:18PM +0000, Hans Buschmann wrote:

839/2360] Compiling C object src/backend/postgres_lib.a.p/optimizer_util_clauses.c.o
../src/backend/optimizer/util/clauses.c: In function ‘recheck_cast_function_args.isra’:
../src/backend/optimizer/util/clauses.c:5152:19: warning: ‘actual_arg_types’ may be used uninitialized [-Wmaybe-uninitialized]
5152 | rettype = enforce_generic_type_consistency(actual_arg_types,

This code is ~18 years old, so I'm dubious there's a real problem here.

Pulling the code into the email:

static void
recheck_cast_function_args(List *args, Oid result_type,
Oid *proargtypes, int pronargs,
HeapTuple func_tuple)
{
[...]
Oid actual_arg_types[FUNC_MAX_ARGS];
[...]
ListCell *lc;

if (list_length(args) > FUNC_MAX_ARGS)
elog(ERROR, "too many function arguments");
nargs = 0;
foreach(lc, args)
{
actual_arg_types[nargs++] = exprType((Node *) lfirst(lc));
}
Assert(nargs == pronargs);
memcpy(declared_arg_types, proargtypes, pronargs * sizeof(Oid));
rettype = enforce_generic_type_consistency(actual_arg_types,

GCC seems right to complain. A NIL list or a list with a length of 0
would initialize none of the elements in actual_arg_types. However, is
this a problem in actuality? No, because we use nargs to make sure we
don't access uninitialized memory in
enforce_generic_type_consistency(). Maybe GCC's static analysis is a lot
smarter than I give it credit for though, and this is a compiler bug in
the newer version.

Does something like this suppress the warning?

Oid actual_arg_types[FUNC_MAX_ARGS] = {InvalidOid};

I could not reproduce on 16.1.0 via nixpkgs or 16.1.1 on Fedora 44
(which is strange), but theoretically this would work.

--
Tristan Partin
PostgreSQL Contributors Team
AWS (https://aws.amazon.com)

#5Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Nathan Bossart (#2)
Re: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

On 2026-Jun-04, Nathan Bossart wrote:

On Thu, Jun 04, 2026 at 02:42:18PM +0000, Hans Buschmann wrote:

839/2360] Compiling C object src/backend/postgres_lib.a.p/optimizer_util_clauses.c.o
../src/backend/optimizer/util/clauses.c: In function ‘recheck_cast_function_args.isra’:
../src/backend/optimizer/util/clauses.c:5152:19: warning: ‘actual_arg_types’ may be used uninitialized [-Wmaybe-uninitialized]
5152 | rettype = enforce_generic_type_consistency(actual_arg_types,

This code is ~18 years old, so I'm dubious there's a real problem here.
Does something like this suppress the warning?

Oid actual_arg_types[FUNC_MAX_ARGS] = {InvalidOid};

I agree that it doesn't look like there's a real problem, and that
something like what you suggest should silence this warning. I mildly
prefer to do " = {0}" though, the rules for C incomplete initializers
being so weird. But I wouldn't oppose this patch as posted.

BTW we seem to do pretty much the same thing in ParseFuncOrColumn(),
right?

--
Álvaro Herrera PostgreSQL Developer — https://www.EnterpriseDB.com/
"People get annoyed when you try to debug them." (Larry Wall)

#6Nathan Bossart
nathandbossart@gmail.com
In reply to: Alvaro Herrera (#5)
Re: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

On Fri, Jun 12, 2026 at 04:54:04PM +0200, Álvaro Herrera wrote:

On 2026-Jun-04, Nathan Bossart wrote:

This code is ~18 years old, so I'm dubious there's a real problem here.
Does something like this suppress the warning?

Oid actual_arg_types[FUNC_MAX_ARGS] = {InvalidOid};

I agree that it doesn't look like there's a real problem, and that
something like what you suggest should silence this warning. I mildly
prefer to do " = {0}" though, the rules for C incomplete initializers
being so weird. But I wouldn't oppose this patch as posted.

WFM. Hans, can you confirm this fixes the issue?

--
nathan

#7Erik Rijkers
er@xs4all.nl
In reply to: Nathan Bossart (#6)
Re: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

Op 6/17/26 om 16:39 schreef Nathan Bossart:

On Fri, Jun 12, 2026 at 04:54:04PM +0200, Álvaro Herrera wrote:

On 2026-Jun-04, Nathan Bossart wrote:

This code is ~18 years old, so I'm dubious there's a real problem here.
Does something like this suppress the warning?

Oid actual_arg_types[FUNC_MAX_ARGS] = {InvalidOid};

I agree that it doesn't look like there's a real problem, and that
something like what you suggest should silence this warning. I mildly
prefer to do " = {0}" though, the rules for C incomplete initializers
being so weird. But I wouldn't oppose this patch as posted.

WFM. Hans, can you confirm this fixes the issue?

FWIW, it silences that warning on my gcc 16.1.0

Erik

#8Hans Buschmann
buschmann@nidsa.net
In reply to: Erik Rijkers (#7)
AW: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

I also can confirm that this silences the compiler warning of GCC 16.1.1.

(tested with pg19_beta1, but should be the same on stable branches like 18.4)

No further tests here.

Hans Buschmann

#9Nathan Bossart
nathandbossart@gmail.com
In reply to: Hans Buschmann (#8)
Re: AW: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

On Thu, Jun 18, 2026 at 11:33:23AM +0000, Hans Buschmann wrote:

I also can confirm that this silences the compiler warning of GCC 16.1.1.

Thanks! I'm debating whether to back-patch this to unsupported branches.
IIUC it qualifies. I'm getting ready to bump up the minimum supported
version of pg_dump and friends to v10, so maybe I should stop there. But
also, stopping at v14 might be good enough for something small like this.
Any opinions?

--
nathan

#10Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Nathan Bossart (#9)
Re: AW: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

On 2026-Jun-18, Nathan Bossart wrote:

On Thu, Jun 18, 2026 at 11:33:23AM +0000, Hans Buschmann wrote:

I also can confirm that this silences the compiler warning of GCC 16.1.1.

Thanks! I'm debating whether to back-patch this to unsupported branches.
IIUC it qualifies. I'm getting ready to bump up the minimum supported
version of pg_dump and friends to v10, so maybe I should stop there. But
also, stopping at v14 might be good enough for something small like this.
Any opinions?

I'd stop at 14 and call it a day. It doesn't prevent building, which is
IIRC the criteria we use for the older branches.

--
Álvaro Herrera PostgreSQL Developer — https://www.EnterpriseDB.com/
"You're _really_ hosed if the person doing the hiring doesn't understand
relational systems: you end up with a whole raft of programmers, none of
whom has had a Date with the clue stick." (Andrew Sullivan)
/messages/by-id/20050809113420.GD2768@phlogiston.dyndns.org

#11Nathan Bossart
nathandbossart@gmail.com
In reply to: Alvaro Herrera (#10)
Re: AW: PG19beta1: GCC 16.1.1 warning: ‘actual_arg_types’ may be used uninitialized in clauses.c

On Thu, Jun 18, 2026 at 06:08:12PM +0200, Álvaro Herrera wrote:

I'd stop at 14 and call it a day. It doesn't prevent building, which is
IIRC the criteria we use for the older branches.

WFM. Committed, thanks.

--
nathan