On 01.09.25 08:47, Peter Eisentraut wrote:
clang-21 shows some new warnings:

../src/backend/access/common/toast_internals.c:296:33: error: variable 'chunk_data' is uninitialized when passed as a const pointer argument here [-Werror,-Wuninitialized-const-pointer]
   296 |         t_values[2] = PointerGetDatum(&chunk_data);

../src/backend/access/gist/gistutil.c:207:28: error: variable 'attrsize' is uninitialized when passed as a const pointer argument here [-Werror,- Wuninitialized-const-pointer]
   207 |                 PointerGetDatum(&attrsize));
       |                                  ^~~~~~~~
../src/backend/access/gist/gistutil.c:276:27: error: variable 'dstsize' is uninitialized when passed as a const pointer argument here [-Werror,- Wuninitialized-const-pointer]
   276 |  PointerGetDatum(&dstsize));
       |                   ^~~~~~~

Here is a quick-fix patch for this. It silences these warnings by initializing the respective variables first. This is already done similarly in nearby code. This can be backpatched to PG16, where these warnings began.

The second patch is a bit of a more extensive code rearrangement to make the need for the workaround in the first patch go away. This would be for master only.
From cb71953c5e4ce5203bb4867711e68ff2891ad3b8 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 8 Sep 2025 12:38:06 +0200
Subject: [PATCH 1/2] Silence compiler warning on clang 21

Clang 21 shows some new compiler warnings, for example:

warning: variable 'dstsize' is uninitialized when passed as a const pointer 
argument here [-Wuninitialized-const-pointer]

The fix is to initialize the variables when they are defined.  This is
similar to, for example, the existing situation in gistKeyIsEQ().

Discussion: 
https://www.postgresql.org/message-id/flat/6604ad6e-5934-43ac-8590-15113d6ae4b1%40eisentraut.org
---
 src/backend/access/common/toast_internals.c | 2 +-
 src/backend/access/gist/gistutil.c          | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/backend/access/common/toast_internals.c 
b/src/backend/access/common/toast_internals.c
index a1d0eed8953..75e908c2e80 100644
--- a/src/backend/access/common/toast_internals.c
+++ b/src/backend/access/common/toast_internals.c
@@ -135,7 +135,7 @@ toast_save_datum(Relation rel, Datum value,
                char            data[TOAST_MAX_CHUNK_SIZE + VARHDRSZ];
                /* ensure union is aligned well enough: */
                int32           align_it;
-       }                       chunk_data;
+       }                       chunk_data = {0};       /* silence compiler 
warning */
        int32           chunk_size;
        int32           chunk_seq = 0;
        char       *data_p;
diff --git a/src/backend/access/gist/gistutil.c 
b/src/backend/access/gist/gistutil.c
index c0aa7d0222f..cdc4ab3151b 100644
--- a/src/backend/access/gist/gistutil.c
+++ b/src/backend/access/gist/gistutil.c
@@ -157,7 +157,7 @@ gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, 
int len,
 {
        int                     i;
        GistEntryVector *evec;
-       int                     attrsize;
+       int                     attrsize = 0;   /* silence compiler warning */
 
        evec = (GistEntryVector *) palloc((len + 2) * sizeof(GISTENTRY) + 
GEVHDRSZ);
 
@@ -242,7 +242,7 @@ gistMakeUnionKey(GISTSTATE *giststate, int attno,
                char            padding[2 * sizeof(GISTENTRY) + GEVHDRSZ];
        }                       storage;
        GistEntryVector *evec = &storage.gev;
-       int                     dstsize;
+       int                     dstsize = 0;    /* silence compiler warning */
 
        evec->n = 2;
 

base-commit: 8191e0c16a0373f851a9f5a8112e3aec105b5276
-- 
2.51.0

From a4e9c43d5fa9642adcd2efa0f7db8efa45328236 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 8 Sep 2025 13:24:29 +0200
Subject: [PATCH 2/2] Some stylistic improvements in toast_save_datum()

Move some variables to a smaller scope.  Initialize chunk_data before
storing a pointer to it; this avoids compiler warnings on clang21, or
respectively us having to work around it by initializing it to zero
before the variable is used.

Discussion: 
https://www.postgresql.org/message-id/flat/6604ad6e-5934-43ac-8590-15113d6ae4b1%40eisentraut.org
---
 src/backend/access/common/toast_internals.c | 39 +++++++++------------
 1 file changed, 16 insertions(+), 23 deletions(-)

diff --git a/src/backend/access/common/toast_internals.c 
b/src/backend/access/common/toast_internals.c
index 75e908c2e80..81dbd67c725 100644
--- a/src/backend/access/common/toast_internals.c
+++ b/src/backend/access/common/toast_internals.c
@@ -121,22 +121,10 @@ toast_save_datum(Relation rel, Datum value,
 {
        Relation        toastrel;
        Relation   *toastidxs;
-       HeapTuple       toasttup;
        TupleDesc       toasttupDesc;
-       Datum           t_values[3];
-       bool            t_isnull[3];
        CommandId       mycid = GetCurrentCommandId(true);
        struct varlena *result;
        struct varatt_external toast_pointer;
-       union
-       {
-               struct varlena hdr;
-               /* this is to make the union big enough for a chunk: */
-               char            data[TOAST_MAX_CHUNK_SIZE + VARHDRSZ];
-               /* ensure union is aligned well enough: */
-               int32           align_it;
-       }                       chunk_data = {0};       /* silence compiler 
warning */
-       int32           chunk_size;
        int32           chunk_seq = 0;
        char       *data_p;
        int32           data_todo;
@@ -289,21 +277,23 @@ toast_save_datum(Relation rel, Datum value,
                }
        }
 
-       /*
-        * Initialize constant parts of the tuple data
-        */
-       t_values[0] = ObjectIdGetDatum(toast_pointer.va_valueid);
-       t_values[2] = PointerGetDatum(&chunk_data);
-       t_isnull[0] = false;
-       t_isnull[1] = false;
-       t_isnull[2] = false;
-
        /*
         * Split up the item into chunks
         */
        while (data_todo > 0)
        {
-               int                     i;
+               HeapTuple       toasttup;
+               Datum           t_values[3];
+               bool            t_isnull[3] = {0};
+               union
+               {
+                       struct varlena hdr;
+                       /* this is to make the union big enough for a chunk: */
+                       char            data[TOAST_MAX_CHUNK_SIZE + VARHDRSZ];
+                       /* ensure union is aligned well enough: */
+                       int32           align_it;
+               }                       chunk_data;
+               int32           chunk_size;
 
                CHECK_FOR_INTERRUPTS();
 
@@ -315,9 +305,12 @@ toast_save_datum(Relation rel, Datum value,
                /*
                 * Build a tuple and store it
                 */
+               t_values[0] = ObjectIdGetDatum(toast_pointer.va_valueid);
                t_values[1] = Int32GetDatum(chunk_seq++);
                SET_VARSIZE(&chunk_data, chunk_size + VARHDRSZ);
                memcpy(VARDATA(&chunk_data), data_p, chunk_size);
+               t_values[2] = PointerGetDatum(&chunk_data);
+
                toasttup = heap_form_tuple(toasttupDesc, t_values, t_isnull);
 
                heap_insert(toastrel, toasttup, mycid, options, NULL);
@@ -333,7 +326,7 @@ toast_save_datum(Relation rel, Datum value,
                 * Note also that there had better not be any user-created 
index on
                 * the TOAST table, since we don't bother to update anything 
else.
                 */
-               for (i = 0; i < num_indexes; i++)
+               for (int i = 0; i < num_indexes; i++)
                {
                        /* Only index relations marked as ready can be updated 
*/
                        if (toastidxs[i]->rd_index->indisready)
-- 
2.51.0

Reply via email to