Don't rely on pointer arithmetic with Pointer type
authorPeter Eisentraut <[email protected]>
Wed, 3 Dec 2025 08:54:15 +0000 (09:54 +0100)
committerPeter Eisentraut <[email protected]>
Wed, 3 Dec 2025 08:54:15 +0000 (09:54 +0100)
The comment for the Pointer type says 'XXX Pointer arithmetic is done
with this, so it can't be void * under "true" ANSI compilers.'.  This
fixes that.  Change from Pointer to use char * explicitly where
pointer arithmetic is needed.  This makes the meaning of the code
clearer locally and removes a dependency on the actual definition of
the Pointer type.  (The definition of the Pointer type is not changed
in this commit.)

Reviewed-by: Chao Li <[email protected]>
Reviewed-by: Bertrand Drouvot <[email protected]>
Discussion: https://www.postgresql.org/message-id/4154950a-47ae-4223-bd01-1235cc50e933%40eisentraut.org

contrib/bloom/bloom.h
contrib/bloom/blutils.c
contrib/bloom/blvacuum.c
src/backend/access/gin/gindatapage.c
src/backend/access/gin/ginxlog.c
src/backend/access/rmgrdesc/genericdesc.c
src/backend/utils/adt/multirangetypes.c
src/backend/utils/adt/rangetypes.c

index 648167045f4e81bc50ef0142a8ea4b6481be2c8c..b2966d37077fa0f5f24f0cf39d3f7fae90d33aac 100644 (file)
@@ -72,7 +72,7 @@ typedef BloomPageOpaqueData *BloomPageOpaque;
        ((BloomTuple *)(PageGetContents(page) \
                + (state)->sizeOfBloomTuple * ((offset) - 1)))
 #define BloomPageGetNextTuple(state, tuple) \
-       ((BloomTuple *)((Pointer)(tuple) + (state)->sizeOfBloomTuple))
+       ((BloomTuple *)((char *)(tuple) + (state)->sizeOfBloomTuple))
 
 /* Preserved page numbers */
 #define BLOOM_METAPAGE_BLKNO   (0)
index bf50037a71ae566d2eee1af6fa85799262ecf6d8..bbeefc3a75b333038ce5771c3572d9770b706f2a 100644 (file)
@@ -324,7 +324,7 @@ BloomPageAddItem(BloomState *state, Page page, BloomTuple *tuple)
 {
        BloomTuple *itup;
        BloomPageOpaque opaque;
-       Pointer         ptr;
+       char       *ptr;
 
        /* We shouldn't be pointed to an invalid page */
        Assert(!PageIsNew(page) && !BloomPageIsDeleted(page));
@@ -340,7 +340,7 @@ BloomPageAddItem(BloomState *state, Page page, BloomTuple *tuple)
 
        /* Adjust maxoff and pd_lower */
        opaque->maxoff++;
-       ptr = (Pointer) BloomPageGetTuple(state, page, opaque->maxoff + 1);
+       ptr = (char *) BloomPageGetTuple(state, page, opaque->maxoff + 1);
        ((PageHeader) page)->pd_lower = ptr - page;
 
        /* Assert we didn't overrun available space */
index 920884ca245b1303755dba4f706ec507f01d824d..1485a6a703fd6e68f0f3430e1d4123a7bc00adc8 100644 (file)
@@ -121,7 +121,7 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
                        if (BloomPageGetMaxOffset(page) == 0)
                                BloomPageSetDeleted(page);
                        /* Adjust pd_lower */
-                       ((PageHeader) page)->pd_lower = (Pointer) itupPtr - page;
+                       ((PageHeader) page)->pd_lower = (char *) itupPtr - page;
                        /* Finish WAL-logging */
                        GenericXLogFinish(gxlogState);
                }
index ab19a854cd7bef2a817ac8a13ec91bceed507542..8d9e3727c518d70d588df11f31624299f1a01b27 100644 (file)
@@ -140,20 +140,20 @@ GinDataLeafPageGetItems(Page page, int *nitems, ItemPointerData advancePast)
        {
                GinPostingList *seg = GinDataLeafPageGetPostingList(page);
                Size            len = GinDataLeafPageGetPostingListSize(page);
-               Pointer         endptr = ((Pointer) seg) + len;
+               char       *endptr = (char *) seg + len;
                GinPostingList *next;
 
                /* Skip to the segment containing advancePast+1 */
                if (ItemPointerIsValid(&advancePast))
                {
                        next = GinNextPostingListSegment(seg);
-                       while ((Pointer) next < endptr &&
+                       while ((char *) next < endptr &&
                                   ginCompareItemPointers(&next->first, &advancePast) <= 0)
                        {
                                seg = next;
                                next = GinNextPostingListSegment(seg);
                        }
-                       len = endptr - (Pointer) seg;
+                       len = endptr - (char *) seg;
                }
 
                if (len > 0)
@@ -1371,8 +1371,8 @@ disassembleLeaf(Page page)
 {
        disassembledLeaf *leaf;
        GinPostingList *seg;
-       Pointer         segbegin;
-       Pointer         segend;
+       char       *segbegin;
+       char       *segend;
 
        leaf = palloc0(sizeof(disassembledLeaf));
        dlist_init(&leaf->segments);
@@ -1383,9 +1383,9 @@ disassembleLeaf(Page page)
                 * Create a leafSegmentInfo entry for each segment.
                 */
                seg = GinDataLeafPageGetPostingList(page);
-               segbegin = (Pointer) seg;
+               segbegin = (char *) seg;
                segend = segbegin + GinDataLeafPageGetPostingListSize(page);
-               while ((Pointer) seg < segend)
+               while ((char *) seg < segend)
                {
                        leafSegmentInfo *seginfo = palloc(sizeof(leafSegmentInfo));
 
@@ -1779,7 +1779,7 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems,
        Buffer          buffer;
        Page            tmppage;
        Page            page;
-       Pointer         ptr;
+       char       *ptr;
        int                     nrootitems;
        int                     rootsize;
        bool            is_build = (buildStats != NULL);
@@ -1795,7 +1795,7 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems,
         */
        nrootitems = 0;
        rootsize = 0;
-       ptr = (Pointer) GinDataLeafPageGetPostingList(tmppage);
+       ptr = (char *) GinDataLeafPageGetPostingList(tmppage);
        while (nrootitems < nitems)
        {
                GinPostingList *segment;
index 606741fa396cc209cbe8c0d3f214672cd12f5ef9..34c01a01165c34644f07e89c707a4acf1e422d93 100644 (file)
@@ -119,12 +119,12 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
        int                     actionno;
        int                     segno;
        GinPostingList *oldseg;
-       Pointer         segmentend;
+       char       *segmentend;
        char       *walbuf;
        int                     totalsize;
-       Pointer         tailCopy = NULL;
-       Pointer         writePtr;
-       Pointer         segptr;
+       void       *tailCopy = NULL;
+       char       *writePtr;
+       char       *segptr;
 
        /*
         * If the page is in pre-9.4 format, convert to new format first.
@@ -164,8 +164,8 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
        }
 
        oldseg = GinDataLeafPageGetPostingList(page);
-       writePtr = (Pointer) oldseg;
-       segmentend = (Pointer) oldseg + GinDataLeafPageGetPostingListSize(page);
+       writePtr = (char *) oldseg;
+       segmentend = (char *) oldseg + GinDataLeafPageGetPostingListSize(page);
        segno = 0;
 
        walbuf = ((char *) data) + sizeof(ginxlogRecompressDataLeaf);
@@ -243,7 +243,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
                        a_action = GIN_SEGMENT_REPLACE;
                }
 
-               segptr = (Pointer) oldseg;
+               segptr = (char *) oldseg;
                if (segptr != segmentend)
                        segsize = SizeOfGinPostingList(oldseg);
                else
@@ -264,7 +264,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
                {
                        int                     tailSize = segmentend - segptr;
 
-                       tailCopy = (Pointer) palloc(tailSize);
+                       tailCopy = palloc(tailSize);
                        memcpy(tailCopy, segptr, tailSize);
                        segptr = tailCopy;
                        oldseg = (GinPostingList *) segptr;
@@ -301,7 +301,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
        }
 
        /* Copy the rest of unmodified segments if any. */
-       segptr = (Pointer) oldseg;
+       segptr = (char *) oldseg;
        if (segptr != segmentend && tailCopy)
        {
                int                     restSize = segmentend - segptr;
@@ -311,7 +311,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf *data)
                writePtr += restSize;
        }
 
-       totalsize = writePtr - (Pointer) GinDataLeafPageGetPostingList(page);
+       totalsize = writePtr - (char *) GinDataLeafPageGetPostingList(page);
        GinDataPageSetDataSize(page, totalsize);
 }
 
index 75dc4108b9aa2d51a914535df70f6df1c00f9aa5..29a4c9e894bf5c4802aaa93eeda714d3106b731e 100644 (file)
@@ -23,8 +23,8 @@
 void
 generic_desc(StringInfo buf, XLogReaderState *record)
 {
-       Pointer         ptr = XLogRecGetData(record),
-                               end = ptr + XLogRecGetDataLen(record);
+       const char *ptr = XLogRecGetData(record);
+       const char *end = ptr + XLogRecGetDataLen(record);
 
        while (ptr < end)
        {
index 55e0b4fdc318d5299d79e60a2c5c420e762d6794..e259644c6ca15ebb4df12ba958671d499b1b2a70 100644 (file)
@@ -68,11 +68,11 @@ typedef enum
  * Macros for accessing past MultirangeType parts of multirange: items, flags
  * and boundaries.
  */
-#define MultirangeGetItemsPtr(mr) ((uint32 *) ((Pointer) (mr) + \
+#define MultirangeGetItemsPtr(mr) ((uint32 *) ((char *) (mr) + \
        sizeof(MultirangeType)))
-#define MultirangeGetFlagsPtr(mr) ((uint8 *) ((Pointer) (mr) + \
+#define MultirangeGetFlagsPtr(mr) ((uint8 *) ((char *) (mr) + \
        sizeof(MultirangeType) + ((mr)->rangeCount - 1) * sizeof(uint32)))
-#define MultirangeGetBoundariesPtr(mr, align) ((Pointer) (mr) + \
+#define MultirangeGetBoundariesPtr(mr, align) ((char *) (mr) + \
        att_align_nominal(sizeof(MultirangeType) + \
                ((mr)->rangeCount - 1) * sizeof(uint32) + \
                (mr)->rangeCount * sizeof(uint8), (align)))
@@ -602,13 +602,13 @@ write_multirange_data(MultirangeType *multirange, TypeCacheEntry *rangetyp,
        uint32          prev_offset = 0;
        uint8      *flags;
        int32           i;
-       Pointer         begin,
-                               ptr;
+       const char *begin;
+       char       *ptr;
        char            elemalign = rangetyp->rngelemtype->typalign;
 
        items = MultirangeGetItemsPtr(multirange);
        flags = MultirangeGetFlagsPtr(multirange);
-       ptr = begin = MultirangeGetBoundariesPtr(multirange, elemalign);
+       begin = ptr = MultirangeGetBoundariesPtr(multirange, elemalign);
        for (i = 0; i < range_count; i++)
        {
                uint32          len;
@@ -627,7 +627,7 @@ write_multirange_data(MultirangeType *multirange, TypeCacheEntry *rangetyp,
                                items[i - 1] |= MULTIRANGE_ITEM_OFF_BIT;
                        prev_offset = ptr - begin;
                }
-               flags[i] = *((Pointer) ranges[i] + VARSIZE(ranges[i]) - sizeof(char));
+               flags[i] = *((char *) ranges[i] + VARSIZE(ranges[i]) - sizeof(char));
                len = VARSIZE(ranges[i]) - sizeof(RangeType) - sizeof(char);
                memcpy(ptr, ranges[i] + 1, len);
                ptr += att_align_nominal(len, elemalign);
@@ -699,8 +699,8 @@ multirange_get_range(TypeCacheEntry *rangetyp,
 {
        uint32          offset;
        uint8           flags;
-       Pointer         begin,
-                               ptr;
+       const char *begin;
+       char       *ptr;
        int16           typlen = rangetyp->rngelemtype->typlen;
        char            typalign = rangetyp->rngelemtype->typalign;
        uint32          len;
@@ -710,7 +710,7 @@ multirange_get_range(TypeCacheEntry *rangetyp,
 
        offset = multirange_get_bounds_offset(multirange, i);
        flags = MultirangeGetFlagsPtr(multirange)[i];
-       ptr = begin = MultirangeGetBoundariesPtr(multirange, typalign) + offset;
+       begin = ptr = MultirangeGetBoundariesPtr(multirange, typalign) + offset;
 
        /*
         * Calculate the size of bound values.  In principle, we could get offset
@@ -719,11 +719,11 @@ multirange_get_range(TypeCacheEntry *rangetyp,
         * exact size.
         */
        if (RANGE_HAS_LBOUND(flags))
-               ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+               ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
        if (RANGE_HAS_UBOUND(flags))
        {
-               ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
-               ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+               ptr = (char *) att_align_pointer(ptr, typalign, typlen, ptr);
+               ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
        }
        len = (ptr - begin) + sizeof(RangeType) + sizeof(uint8);
 
@@ -749,7 +749,7 @@ multirange_get_bounds(TypeCacheEntry *rangetyp,
 {
        uint32          offset;
        uint8           flags;
-       Pointer         ptr;
+       const char *ptr;
        int16           typlen = rangetyp->rngelemtype->typlen;
        char            typalign = rangetyp->rngelemtype->typalign;
        bool            typbyval = rangetyp->rngelemtype->typbyval;
@@ -770,7 +770,7 @@ multirange_get_bounds(TypeCacheEntry *rangetyp,
        {
                /* att_align_pointer cannot be necessary here */
                lbound = fetch_att(ptr, typbyval, typlen);
-               ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+               ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
        }
        else
                lbound = (Datum) 0;
@@ -778,7 +778,7 @@ multirange_get_bounds(TypeCacheEntry *rangetyp,
        /* fetch upper bound, if any */
        if (RANGE_HAS_UBOUND(flags))
        {
-               ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
+               ptr = (char *) att_align_pointer(ptr, typalign, typlen, ptr);
                ubound = fetch_att(ptr, typbyval, typlen);
                /* no need for att_addlength_pointer */
        }
index 065a8000cf2992f81549e9df68d516f9f5880b8d..b7e9f6dc0a8ebf1a25e3358be5dbec5a758161f5 100644 (file)
@@ -72,8 +72,8 @@ static char *range_deparse(char flags, const char *lbound_str,
 static char *range_bound_escape(const char *value);
 static Size datum_compute_size(Size data_length, Datum val, bool typbyval,
                                                           char typalign, int16 typlen, char typstorage);
-static Pointer datum_write(Pointer ptr, Datum datum, bool typbyval,
-                                                  char typalign, int16 typlen, char typstorage);
+static char *datum_write(char *ptr, Datum datum, bool typbyval,
+                                                char typalign, int16 typlen, char typstorage);
 static Node *find_simplified_clause(PlannerInfo *root,
                                                                        Expr *rangeExpr, Expr *elemExpr);
 static Expr *build_bound_expr(Expr *elemExpr, Datum val,
@@ -2092,7 +2092,7 @@ range_deserialize(TypeCacheEntry *typcache, const RangeType *range,
        int16           typlen;
        bool            typbyval;
        char            typalign;
-       Pointer         ptr;
+       const char *ptr;
        Datum           lbound;
        Datum           ubound;
 
@@ -2108,14 +2108,14 @@ range_deserialize(TypeCacheEntry *typcache, const RangeType *range,
        typalign = typcache->rngelemtype->typalign;
 
        /* initialize data pointer just after the range OID */
-       ptr = (Pointer) (range + 1);
+       ptr = (char *) (range + 1);
 
        /* fetch lower bound, if any */
        if (RANGE_HAS_LBOUND(flags))
        {
                /* att_align_pointer cannot be necessary here */
                lbound = fetch_att(ptr, typbyval, typlen);
-               ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+               ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
        }
        else
                lbound = (Datum) 0;
@@ -2123,7 +2123,7 @@ range_deserialize(TypeCacheEntry *typcache, const RangeType *range,
        /* fetch upper bound, if any */
        if (RANGE_HAS_UBOUND(flags))
        {
-               ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
+               ptr = (char *) att_align_pointer(ptr, typalign, typlen, ptr);
                ubound = fetch_att(ptr, typbyval, typlen);
                /* no need for att_addlength_pointer */
        }
@@ -2937,8 +2937,8 @@ datum_compute_size(Size data_length, Datum val, bool typbyval, char typalign,
  * Write the given datum beginning at ptr (after advancing to correct
  * alignment, if needed).  Return the pointer incremented by space used.
  */
-static Pointer
-datum_write(Pointer ptr, Datum datum, bool typbyval, char typalign,
+static char *
+datum_write(char *ptr, Datum datum, bool typbyval, char typalign,
                        int16 typlen, char typstorage)
 {
        Size            data_length;