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 <[email protected]>
Gesendet: Freitag, 5. Juni 2026 00:24
An: Nathan Bossart
Cc: [email protected]; 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)

Reply via email to