Suppress spurious Coverity warning in prune freeze logic
authorMelanie Plageman <melanieplageman@gmail.com>
Thu, 4 Dec 2025 23:55:02 +0000 (18:55 -0500)
committerMelanie Plageman <melanieplageman@gmail.com>
Thu, 4 Dec 2025 23:55:02 +0000 (18:55 -0500)
Adjust the prune_freeze_setup() parameter types of new_relfrozen_xid and
new_relmin_mxid to prevent misleading Coverity analysis.
heap_page_prune_and_freeze() compared these values against NULL when
passing them to prune_freeze_setup(), causing Coverity to assume they
could be NULL and flag a possible null-pointer dereference later, even
though it occurs inside a directly related conditional.

Reported-by: Coverity
Author: Melanie Plageman <melanieplageman@gmail.com>

src/backend/access/heap/pruneheap.c

index 5af84b4c875dd78ec747ea066f44ca19d022fe3b..ca44225a10edde7986b0fd674f25f33f9eab3d3e 100644 (file)
@@ -158,8 +158,8 @@ typedef struct
 
 /* Local functions */
 static void prune_freeze_setup(PruneFreezeParams *params,
-                              TransactionId new_relfrozen_xid,
-                              MultiXactId new_relmin_mxid,
+                              TransactionId *new_relfrozen_xid,
+                              MultiXactId *new_relmin_mxid,
                               const PruneFreezeResult *presult,
                               PruneState *prstate);
 static void prune_freeze_plan(Oid reloid, Buffer buffer,
@@ -325,8 +325,8 @@ heap_page_prune_opt(Relation relation, Buffer buffer)
  */
 static void
 prune_freeze_setup(PruneFreezeParams *params,
-                  TransactionId new_relfrozen_xid,
-                  MultiXactId new_relmin_mxid,
+                  TransactionId *new_relfrozen_xid,
+                  MultiXactId *new_relmin_mxid,
                   const PruneFreezeResult *presult,
                   PruneState *prstate)
 {
@@ -362,15 +362,15 @@ prune_freeze_setup(PruneFreezeParams *params,
    prstate->pagefrz.freeze_required = false;
    if (prstate->attempt_freeze)
    {
-       prstate->pagefrz.FreezePageRelfrozenXid = new_relfrozen_xid;
-       prstate->pagefrz.NoFreezePageRelfrozenXid = new_relfrozen_xid;
-       prstate->pagefrz.FreezePageRelminMxid = new_relmin_mxid;
-       prstate->pagefrz.NoFreezePageRelminMxid = new_relmin_mxid;
+       Assert(new_relfrozen_xid && new_relmin_mxid);
+       prstate->pagefrz.FreezePageRelfrozenXid = *new_relfrozen_xid;
+       prstate->pagefrz.NoFreezePageRelfrozenXid = *new_relfrozen_xid;
+       prstate->pagefrz.FreezePageRelminMxid = *new_relmin_mxid;
+       prstate->pagefrz.NoFreezePageRelminMxid = *new_relmin_mxid;
    }
    else
    {
-       Assert(new_relfrozen_xid == InvalidTransactionId &&
-              new_relmin_mxid == InvalidMultiXactId);
+       Assert(!new_relfrozen_xid && !new_relmin_mxid);
        prstate->pagefrz.FreezePageRelminMxid = InvalidMultiXactId;
        prstate->pagefrz.NoFreezePageRelminMxid = InvalidMultiXactId;
        prstate->pagefrz.FreezePageRelfrozenXid = InvalidTransactionId;
@@ -823,12 +823,8 @@ heap_page_prune_and_freeze(PruneFreezeParams *params,
 
    /* Initialize prstate */
    prune_freeze_setup(params,
-                      new_relfrozen_xid ?
-                      *new_relfrozen_xid : InvalidTransactionId,
-                      new_relmin_mxid ?
-                      *new_relmin_mxid : InvalidMultiXactId,
-                      presult,
-                      &prstate);
+                      new_relfrozen_xid, new_relmin_mxid,
+                      presult, &prstate);
 
    /*
     * Examine all line pointers and tuple visibility information to determine