Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Use FLEXIBLE_ARRAY_MEMBER in a bunch more places.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Feb 2015 05:11:42 +0000 (00:11 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Feb 2015 05:11:42 +0000 (00:11 -0500)
Replace some bogus "x[1]" declarations with "x[FLEXIBLE_ARRAY_MEMBER]".
Aside from being more self-documenting, this should help prevent bogus
warnings from static code analyzers and perhaps compiler misoptimizations.

This patch is just a down payment on eliminating the whole problem, but
it gets rid of a lot of easy-to-fix cases.

Note that the main problem with doing this is that one must no longer rely
on computing sizeof(the containing struct), since the result would be
compiler-dependent.  Instead use offsetof(struct, lastfield).  Autoconf
also warns against spelling that offsetof(struct, lastfield[0]).

Michael Paquier, review and additional fixes by me.

44 files changed:
contrib/cube/cubedata.h
contrib/intarray/_int.h
contrib/ltree/ltree.h
contrib/pageinspect/rawpage.c
contrib/pg_trgm/trgm.h
src/backend/catalog/namespace.c
src/backend/commands/prepare.c
src/backend/executor/functions.c
src/backend/executor/spi.c
src/backend/nodes/params.c
src/backend/postmaster/syslogger.c
src/backend/tcop/postgres.c
src/backend/utils/adt/geo_ops.c
src/backend/utils/cache/catcache.c
src/bin/pg_dump/dumputils.c
src/bin/pg_dump/dumputils.h
src/include/access/gin_private.h
src/include/access/gist_private.h
src/include/access/heapam_xlog.h
src/include/access/spgist_private.h
src/include/access/xact.h
src/include/c.h
src/include/catalog/namespace.h
src/include/commands/dbcommands.h
src/include/commands/tablespace.h
src/include/executor/hashjoin.h
src/include/nodes/bitmapset.h
src/include/nodes/params.h
src/include/nodes/tidbitmap.h
src/include/postgres.h
src/include/postmaster/syslogger.h
src/include/replication/walsender_private.h
src/include/storage/bufpage.h
src/include/storage/fsm_internals.h
src/include/storage/standby.h
src/include/tsearch/dicts/regis.h
src/include/tsearch/dicts/spell.h
src/include/tsearch/ts_type.h
src/include/utils/catcache.h
src/include/utils/datetime.h
src/include/utils/geo_decls.h
src/include/utils/jsonb.h
src/include/utils/relmapper.h
src/include/utils/varbit.h

index 5d44e110817ad5281e3f983ec2f7a0fb4350e38b..719e43d421c4845afba0e0e78d8805ff6426404f 100644 (file)
@@ -23,11 +23,10 @@ typedef struct NDBOX
    unsigned int header;
 
    /*
-    * Variable length array. The lower left coordinates for each dimension
-    * come first, followed by upper right coordinates unless the point flag
-    * is set.
+    * The lower left coordinates for each dimension come first, followed by
+    * upper right coordinates unless the point flag is set.
     */
-   double      x[1];
+   double      x[FLEXIBLE_ARRAY_MEMBER];
 } NDBOX;
 
 #define POINT_BIT          0x80000000
@@ -41,9 +40,9 @@ typedef struct NDBOX
 #define LL_COORD(cube, i) ( (cube)->x[i] )
 #define UR_COORD(cube, i) ( IS_POINT(cube) ? (cube)->x[i] : (cube)->x[(i) + DIM(cube)] )
 
-#define POINT_SIZE(_dim) (offsetof(NDBOX, x[0]) + sizeof(double)*(_dim))
-#define CUBE_SIZE(_dim) (offsetof(NDBOX, x[0]) + sizeof(double)*(_dim)*2)
+#define POINT_SIZE(_dim)   (offsetof(NDBOX, x) + sizeof(double)*(_dim))
+#define CUBE_SIZE(_dim)        (offsetof(NDBOX, x) + sizeof(double)*(_dim)*2)
 
-#define DatumGetNDBOX(x)   ((NDBOX*)DatumGetPointer(x))
-#define PG_GETARG_NDBOX(x) DatumGetNDBOX( PG_DETOAST_DATUM(PG_GETARG_DATUM(x)) )
+#define DatumGetNDBOX(x)   ((NDBOX *) PG_DETOAST_DATUM(x))
+#define PG_GETARG_NDBOX(x) DatumGetNDBOX(PG_GETARG_DATUM(x))
 #define PG_RETURN_NDBOX(x) PG_RETURN_POINTER(x)
index 7f93206e890b626619282b5501190b5924635687..d524f0fed53feb61650e3dcb1dfc87908e3d1218 100644 (file)
@@ -73,7 +73,7 @@ typedef struct
 {
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    int32       flag;
-   char        data[1];
+   char        data[FLEXIBLE_ARRAY_MEMBER];
 } GISTTYPE;
 
 #define ALLISTRUE      0x04
@@ -133,7 +133,7 @@ typedef struct QUERYTYPE
 {
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    int32       size;           /* number of ITEMs */
-   ITEM        items[1];       /* variable length array */
+   ITEM        items[FLEXIBLE_ARRAY_MEMBER];
 } QUERYTYPE;
 
 #define HDRSIZEQT  offsetof(QUERYTYPE, items)
index 1b1305b48393b72c634fd778becd9d2d9dd1dadc..c604357dbfbb215ced194ed801fbe90247dd62d5 100644 (file)
@@ -10,7 +10,7 @@
 typedef struct
 {
    uint16      len;
-   char        name[1];
+   char        name[FLEXIBLE_ARRAY_MEMBER];
 } ltree_level;
 
 #define LEVEL_HDRSIZE  (offsetof(ltree_level,name))
@@ -20,7 +20,7 @@ typedef struct
 {
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    uint16      numlevel;
-   char        data[1];
+   char        data[FLEXIBLE_ARRAY_MEMBER];
 } ltree;
 
 #define LTREE_HDRSIZE  MAXALIGN( offsetof(ltree, data) )
@@ -34,7 +34,7 @@ typedef struct
    int32       val;
    uint16      len;
    uint8       flag;
-   char        name[1];
+   char        name[FLEXIBLE_ARRAY_MEMBER];
 } lquery_variant;
 
 #define LVAR_HDRSIZE   MAXALIGN(offsetof(lquery_variant, name))
@@ -51,7 +51,7 @@ typedef struct
    uint16      numvar;
    uint16      low;
    uint16      high;
-   char        variants[1];
+   char        variants[FLEXIBLE_ARRAY_MEMBER];
 } lquery_level;
 
 #define LQL_HDRSIZE MAXALIGN( offsetof(lquery_level,variants) )
@@ -72,7 +72,7 @@ typedef struct
    uint16      numlevel;
    uint16      firstgood;
    uint16      flag;
-   char        data[1];
+   char        data[FLEXIBLE_ARRAY_MEMBER];
 } lquery;
 
 #define LQUERY_HDRSIZE  MAXALIGN( offsetof(lquery, data) )
@@ -107,7 +107,7 @@ typedef struct
 {
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    int32       size;
-   char        data[1];
+   char        data[FLEXIBLE_ARRAY_MEMBER];
 } ltxtquery;
 
 #define HDRSIZEQT      MAXALIGN(VARHDRSZ + sizeof(int32))
@@ -208,7 +208,7 @@ typedef struct
 {
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    uint32      flag;
-   char        data[1];
+   char        data[FLEXIBLE_ARRAY_MEMBER];
 } ltree_gist;
 
 #define LTG_ONENODE 0x01
index 1dada098af93e01ee980e1c03df94eee59245f70..38c136f9876953f0257d3a196ab2522f8d535a7b 100644 (file)
@@ -192,7 +192,7 @@ page_header(PG_FUNCTION_ARGS)
     * Check that enough data was supplied, so that we don't try to access
     * fields outside the supplied buffer.
     */
-   if (raw_page_size < sizeof(PageHeaderData))
+   if (raw_page_size < SizeOfPageHeaderData)
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                 errmsg("input page too small (%d bytes)", raw_page_size)));
index ed649b8dccd57cf4e34b39a3d9b1146d19478c20..f030558088c456b90c95af6d8a13304f648508d4 100644 (file)
@@ -63,7 +63,7 @@ typedef struct
 {
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    uint8       flag;
-   char        data[1];
+   char        data[FLEXIBLE_ARRAY_MEMBER];
 } TRGM;
 
 #define TRGMHDRSIZE          (VARHDRSZ + sizeof(uint8))
index bfb4fdcc66830f1f12d0a67c28950b39bb3fd647..1af977cb1d71bc8cb0cd78880cc145f82375a1f1 100644 (file)
@@ -261,9 +261,9 @@ RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode,
     * with the answer changing under them, or that they already hold some
     * appropriate lock, and therefore return the first answer we get without
     * checking for invalidation messages.  Also, if the requested lock is
-    * already held, LockRelationOid will not AcceptInvalidationMessages,
-    * so we may fail to notice a change.  We could protect against that case
-    * by calling AcceptInvalidationMessages() before beginning this loop, but
+    * already held, LockRelationOid will not AcceptInvalidationMessages, so
+    * we may fail to notice a change.  We could protect against that case by
+    * calling AcceptInvalidationMessages() before beginning this loop, but
     * that would add a significant amount overhead, so for now we don't.
     */
    for (;;)
@@ -1075,8 +1075,8 @@ FuncnameGetCandidates(List *names, int nargs, List *argnames,
         */
        effective_nargs = Max(pronargs, nargs);
        newResult = (FuncCandidateList)
-           palloc(sizeof(struct _FuncCandidateList) - sizeof(Oid)
-                  effective_nargs * sizeof(Oid));
+           palloc(offsetof(struct _FuncCandidateList, args) +
+                  effective_nargs * sizeof(Oid));
        newResult->pathpos = pathpos;
        newResult->oid = HeapTupleGetOid(proctup);
        newResult->nargs = effective_nargs;
@@ -1597,7 +1597,8 @@ OpernameGetCandidates(List *names, char oprkind, bool missing_schema_ok)
     * separate palloc for each operator, but profiling revealed that the
     * pallocs used an unreasonably large fraction of parsing time.
     */
-#define SPACE_PER_OP MAXALIGN(sizeof(struct _FuncCandidateList) + sizeof(Oid))
+#define SPACE_PER_OP MAXALIGN(offsetof(struct _FuncCandidateList, args) + \
+                             2 * sizeof(Oid))
 
    if (catlist->n_members > 0)
        resultSpace = palloc(catlist->n_members * SPACE_PER_OP);
index 71b08f01bf3cf9c8ce6a18d88d40bd3aa67e426b..fb33d305aff3d0be30d5b1c06df544624475217c 100644 (file)
@@ -383,10 +383,9 @@ EvaluateParams(PreparedStatement *pstmt, List *params,
    /* Prepare the expressions for execution */
    exprstates = (List *) ExecPrepareExpr((Expr *) params, estate);
 
-   /* sizeof(ParamListInfoData) includes the first array element */
    paramLI = (ParamListInfo)
-       palloc(sizeof(ParamListInfoData) +
-              (num_params - 1) * sizeof(ParamExternData));
+       palloc(offsetof(ParamListInfoData, params) +
+              num_params * sizeof(ParamExternData));
    /* we have static list of params, so no hooks needed */
    paramLI->paramFetch = NULL;
    paramLI->paramFetchArg = NULL;
index 84be37c7a39d5a8d19ddc522640b45c8ebdfdf60..6c3eff7c584156f5c25eaa0cd199457fc5950a8d 100644 (file)
@@ -896,9 +896,9 @@ postquel_sub_params(SQLFunctionCachePtr fcache,
 
        if (fcache->paramLI == NULL)
        {
-           /* sizeof(ParamListInfoData) includes the first array element */
-           paramLI = (ParamListInfo) palloc(sizeof(ParamListInfoData) +
-                                     (nargs - 1) * sizeof(ParamExternData));
+           paramLI = (ParamListInfo)
+               palloc(offsetof(ParamListInfoData, params) +
+                      nargs * sizeof(ParamExternData));
            /* we have static list of params, so no hooks needed */
            paramLI->paramFetch = NULL;
            paramLI->paramFetchArg = NULL;
index 4b86e910df827ad425c8fb1487d9720bcb00e090..b3c05025bc08757b7d2d73a9a6bb6552f0678689 100644 (file)
@@ -2290,9 +2290,8 @@ _SPI_convert_params(int nargs, Oid *argtypes,
    {
        int         i;
 
-       /* sizeof(ParamListInfoData) includes the first array element */
-       paramLI = (ParamListInfo) palloc(sizeof(ParamListInfoData) +
-                                     (nargs - 1) * sizeof(ParamExternData));
+       paramLI = (ParamListInfo) palloc(offsetof(ParamListInfoData, params) +
+                                        nargs * sizeof(ParamExternData));
        /* we have static list of params, so no hooks needed */
        paramLI->paramFetch = NULL;
        paramLI->paramFetchArg = NULL;
index 2f2f5edb8323366365cda5dd20bb308832cd56b7..fb803f8ee8bc946abb43f30572afdaa5bd19e744 100644 (file)
@@ -40,9 +40,8 @@ copyParamList(ParamListInfo from)
    if (from == NULL || from->numParams <= 0)
        return NULL;
 
-   /* sizeof(ParamListInfoData) includes the first array element */
-   size = sizeof(ParamListInfoData) +
-       (from->numParams - 1) * sizeof(ParamExternData);
+   size = offsetof(ParamListInfoData, params) +
+       from->numParams * sizeof(ParamExternData);
 
    retval = (ParamListInfo) palloc(size);
    retval->paramFetch = NULL;
index 41b8dbb6c254a934d1a4b459ca98dc3b5939f6dc..14ff1477c163484fbdb71f0d00e359903c440938 100644 (file)
@@ -785,13 +785,13 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer)
    int         dest = LOG_DESTINATION_STDERR;
 
    /* While we have enough for a header, process data... */
-   while (count >= (int) sizeof(PipeProtoHeader))
+   while (count >= (int) (offsetof(PipeProtoHeader, data) +1))
    {
        PipeProtoHeader p;
        int         chunklen;
 
        /* Do we have a valid header? */
-       memcpy(&p, cursor, sizeof(PipeProtoHeader));
+       memcpy(&p, cursor, offsetof(PipeProtoHeader, data));
        if (p.nuls[0] == '\0' && p.nuls[1] == '\0' &&
            p.len > 0 && p.len <= PIPE_MAX_PAYLOAD &&
            p.pid != 0 &&
index 28af40c3dc6a4f3ff599f2ff004e3e61f55ddc4f..33720e8f8b89c68930cf175fc29e12beceb61095 100644 (file)
@@ -1619,9 +1619,8 @@ exec_bind_message(StringInfo input_message)
    {
        int         paramno;
 
-       /* sizeof(ParamListInfoData) includes the first array element */
-       params = (ParamListInfo) palloc(sizeof(ParamListInfoData) +
-                                 (numParams - 1) * sizeof(ParamExternData));
+       params = (ParamListInfo) palloc(offsetof(ParamListInfoData, params) +
+                                       numParams * sizeof(ParamExternData));
        /* we have static list of params, so no hooks needed */
        params->paramFetch = NULL;
        params->paramFetchArg = NULL;
index 6b6510e8e2a0464b8b9840c1c8ac787853dc4f60..6cb6be5c5fd0f87a88240d86d7cb0ea9f4812508 100644 (file)
@@ -1390,7 +1390,7 @@ path_in(PG_FUNCTION_ARGS)
    }
 
    base_size = sizeof(path->p[0]) * npts;
-   size = offsetof(PATH, p[0]) +base_size;
+   size = offsetof(PATH, p) +base_size;
 
    /* Check for integer overflow */
    if (base_size / npts != sizeof(path->p[0]) || size <= base_size)
@@ -1443,12 +1443,12 @@ path_recv(PG_FUNCTION_ARGS)
 
    closed = pq_getmsgbyte(buf);
    npts = pq_getmsgint(buf, sizeof(int32));
-   if (npts <= 0 || npts >= (int32) ((INT_MAX - offsetof(PATH, p[0])) / sizeof(Point)))
+   if (npts <= 0 || npts >= (int32) ((INT_MAX - offsetof(PATH, p)) / sizeof(Point)))
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
             errmsg("invalid number of points in external \"path\" value")));
 
-   size = offsetof(PATH, p[0]) +sizeof(path->p[0]) * npts;
+   size = offsetof(PATH, p) +sizeof(path->p[0]) * npts;
    path = (PATH *) palloc(size);
 
    SET_VARSIZE(path, size);
@@ -3476,7 +3476,7 @@ poly_in(PG_FUNCTION_ARGS)
              errmsg("invalid input syntax for type polygon: \"%s\"", str)));
 
    base_size = sizeof(poly->p[0]) * npts;
-   size = offsetof(POLYGON, p[0]) +base_size;
+   size = offsetof(POLYGON, p) +base_size;
 
    /* Check for integer overflow */
    if (base_size / npts != sizeof(poly->p[0]) || size <= base_size)
@@ -3530,12 +3530,12 @@ poly_recv(PG_FUNCTION_ARGS)
    int         size;
 
    npts = pq_getmsgint(buf, sizeof(int32));
-   if (npts <= 0 || npts >= (int32) ((INT_MAX - offsetof(POLYGON, p[0])) / sizeof(Point)))
+   if (npts <= 0 || npts >= (int32) ((INT_MAX - offsetof(POLYGON, p)) / sizeof(Point)))
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION),
          errmsg("invalid number of points in external \"polygon\" value")));
 
-   size = offsetof(POLYGON, p[0]) +sizeof(poly->p[0]) * npts;
+   size = offsetof(POLYGON, p) +sizeof(poly->p[0]) * npts;
    poly = (POLYGON *) palloc0(size);   /* zero any holes */
 
    SET_VARSIZE(poly, size);
@@ -4251,7 +4251,7 @@ path_add(PG_FUNCTION_ARGS)
        PG_RETURN_NULL();
 
    base_size = sizeof(p1->p[0]) * (p1->npts + p2->npts);
-   size = offsetof(PATH, p[0]) +base_size;
+   size = offsetof(PATH, p) +base_size;
 
    /* Check for integer overflow */
    if (base_size / sizeof(p1->p[0]) != (p1->npts + p2->npts) ||
@@ -4393,7 +4393,7 @@ path_poly(PG_FUNCTION_ARGS)
     * Never overflows: the old size fit in MaxAllocSize, and the new size is
     * just a small constant larger.
     */
-   size = offsetof(POLYGON, p[0]) +sizeof(poly->p[0]) * path->npts;
+   size = offsetof(POLYGON, p) +sizeof(poly->p[0]) * path->npts;
    poly = (POLYGON *) palloc(size);
 
    SET_VARSIZE(poly, size);
@@ -4468,7 +4468,7 @@ box_poly(PG_FUNCTION_ARGS)
    int         size;
 
    /* map four corners of the box to a polygon */
-   size = offsetof(POLYGON, p[0]) +sizeof(poly->p[0]) * 4;
+   size = offsetof(POLYGON, p) +sizeof(poly->p[0]) * 4;
    poly = (POLYGON *) palloc(size);
 
    SET_VARSIZE(poly, size);
@@ -4502,7 +4502,7 @@ poly_path(PG_FUNCTION_ARGS)
     * Never overflows: the old size fit in MaxAllocSize, and the new size is
     * smaller by a small constant.
     */
-   size = offsetof(PATH, p[0]) +sizeof(path->p[0]) * poly->npts;
+   size = offsetof(PATH, p) +sizeof(path->p[0]) * poly->npts;
    path = (PATH *) palloc(size);
 
    SET_VARSIZE(path, size);
@@ -5181,7 +5181,7 @@ circle_poly(PG_FUNCTION_ARGS)
                 errmsg("must request at least 2 points")));
 
    base_size = sizeof(poly->p[0]) * npts;
-   size = offsetof(POLYGON, p[0]) +base_size;
+   size = offsetof(POLYGON, p) +base_size;
 
    /* Check for integer overflow */
    if (base_size / npts != sizeof(poly->p[0]) || size <= base_size)
index 2e4d0b393a3b1cf0f8201392a6dac40bcb6885f5..1af43c6de677e2cc6738389a62b36c27d921211d 100644 (file)
@@ -1590,7 +1590,7 @@ SearchCatCacheList(CatCache *cache,
        oldcxt = MemoryContextSwitchTo(CacheMemoryContext);
        nmembers = list_length(ctlist);
        cl = (CatCList *)
-           palloc(sizeof(CatCList) + nmembers * sizeof(CatCTup *));
+           palloc(offsetof(CatCList, members) +nmembers * sizeof(CatCTup *));
        heap_copytuple_with_tuple(ntp, &cl->tuple);
        MemoryContextSwitchTo(oldcxt);
        heap_freetuple(ntp);
index 095c50770ba1992734bf5b7b0ceb7d3c699a3651..d7506e119e256ec95a91bd90ab0b7759a543a0f4 100644 (file)
@@ -1216,9 +1216,8 @@ simple_string_list_append(SimpleStringList *list, const char *val)
 {
    SimpleStringListCell *cell;
 
-   /* this calculation correctly accounts for the null trailing byte */
    cell = (SimpleStringListCell *)
-       pg_malloc(sizeof(SimpleStringListCell) + strlen(val));
+       pg_malloc(offsetof(SimpleStringListCell, val) +strlen(val) + 1);
 
    cell->next = NULL;
    strcpy(cell->val, val);
index a39c1b66b08e5edf84ea6bb237f7f30988ab9f57..b1767468c13c7657db9198dc628550c75c51a61b 100644 (file)
@@ -38,7 +38,7 @@ typedef struct SimpleOidList
 typedef struct SimpleStringListCell
 {
    struct SimpleStringListCell *next;
-   char        val[1];         /* VARIABLE LENGTH FIELD */
+   char        val[FLEXIBLE_ARRAY_MEMBER];     /* null-terminated string here */
 } SimpleStringListCell;
 
 typedef struct SimpleStringList
index 9bb0ba4b059693c5199440fa9e12120b5756018c..c1a2049d08f35210bdef7149b92b8fcfa09afdee 100644 (file)
@@ -322,7 +322,7 @@ typedef struct GinOptions
 {
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    bool        useFastUpdate;  /* use fast updates? */
-   int         pendingListCleanupSize; /* maximum size of pending list */
+   int         pendingListCleanupSize; /* maximum size of pending list */
 } GinOptions;
 
 #define GIN_DEFAULT_USE_FASTUPDATE true
@@ -389,7 +389,7 @@ typedef struct
 {
    ItemPointerData first;      /* first item in this posting list (unpacked) */
    uint16      nbytes;         /* number of bytes that follow */
-   unsigned char bytes[1];     /* varbyte encoded items (variable length) */
+   unsigned char bytes[FLEXIBLE_ARRAY_MEMBER]; /* varbyte encoded items */
 } GinPostingList;
 
 #define SizeOfGinPostingList(plist) (offsetof(GinPostingList, bytes) + SHORTALIGN((plist)->nbytes) )
index 382826eb857a1a11819f5656774f878bbab52cdb..ce83042e177cfcc069017f7344d18a14359915c4 100644 (file)
@@ -47,7 +47,7 @@ typedef struct
 {
    BlockNumber prev;
    uint32      freespace;
-   char        tupledata[1];
+   char        tupledata[FLEXIBLE_ARRAY_MEMBER];
 } GISTNodeBufferPage;
 
 #define BUFFER_PAGE_DATA_OFFSET MAXALIGN(offsetof(GISTNodeBufferPage, tupledata))
@@ -131,7 +131,8 @@ typedef struct GISTSearchItem
        /* we must store parentlsn to detect whether a split occurred */
        GISTSearchHeapItem heap;    /* heap info, if heap tuple */
    }           data;
-   double      distances[1];   /* array with numberOfOrderBys entries */
+   double      distances[FLEXIBLE_ARRAY_MEMBER];       /* numberOfOrderBys
+                                                        * entries */
 } GISTSearchItem;
 
 #define GISTSearchItemIsHeap(item) ((item).blkno == InvalidBlockNumber)
@@ -144,7 +145,7 @@ typedef struct GISTSearchItem
 typedef struct GISTScanOpaqueData
 {
    GISTSTATE  *giststate;      /* index information, see above */
-   pairingheap *queue;     /* queue of unvisited items */
+   pairingheap *queue;         /* queue of unvisited items */
    MemoryContext queueCxt;     /* context holding the queue */
    bool        qual_ok;        /* false if qual can never be satisfied */
    bool        firstCall;      /* true until first gistgettuple call */
index a2ed2a058f778110ac21a97b0a0deb361db9ef8d..f0f89dec0f229a41d4f169647e49f9e18185ce29 100644 (file)
@@ -132,7 +132,7 @@ typedef struct xl_heap_multi_insert
 {
    uint8       flags;
    uint16      ntuples;
-   OffsetNumber offsets[1];
+   OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
 } xl_heap_multi_insert;
 
 #define SizeOfHeapMultiInsert  offsetof(xl_heap_multi_insert, offsets)
index f11d8ef490d4f7d58fe89c8a5fd357e5895f842f..0492ef6114b5d47f16974392976250c31b22b16d 100644 (file)
@@ -426,7 +426,7 @@ typedef struct spgxlogMoveLeafs
     * the dead tuple from the source
     *----------
     */
-   OffsetNumber offsets[1];
+   OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
 } spgxlogMoveLeafs;
 
 #define SizeOfSpgxlogMoveLeafs offsetof(spgxlogMoveLeafs, offsets)
@@ -534,7 +534,7 @@ typedef struct spgxlogPickSplit
     *      list of leaf tuples, length nInsert (unaligned!)
     *----------
     */
-   OffsetNumber offsets[1];
+   OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
 } spgxlogPickSplit;
 
 #define SizeOfSpgxlogPickSplit offsetof(spgxlogPickSplit, offsets)
@@ -558,7 +558,7 @@ typedef struct spgxlogVacuumLeaf
     *      tuple numbers to insert in nextOffset links
     *----------
     */
-   OffsetNumber offsets[1];
+   OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
 } spgxlogVacuumLeaf;
 
 #define SizeOfSpgxlogVacuumLeaf offsetof(spgxlogVacuumLeaf, offsets)
@@ -571,7 +571,7 @@ typedef struct spgxlogVacuumRoot
    spgxlogState stateSrc;
 
    /* offsets of tuples to delete follow */
-   OffsetNumber offsets[1];
+   OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
 } spgxlogVacuumRoot;
 
 #define SizeOfSpgxlogVacuumRoot offsetof(spgxlogVacuumRoot, offsets)
@@ -583,7 +583,7 @@ typedef struct spgxlogVacuumRedirect
    TransactionId newestRedirectXid;    /* newest XID of removed redirects */
 
    /* offsets of redirect tuples to make placeholders follow */
-   OffsetNumber offsets[1];
+   OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
 } spgxlogVacuumRedirect;
 
 #define SizeOfSpgxlogVacuumRedirect offsetof(spgxlogVacuumRedirect, offsets)
index 8205504e6e7c4fc89f7016bf90a71daeebbd0237..d7e5f6447c9b6444a0e8fdd0e0829c32978944db 100644 (file)
@@ -118,7 +118,7 @@ typedef struct xl_xact_assignment
 {
    TransactionId xtop;         /* assigned XID's top-level XID */
    int         nsubxacts;      /* number of subtransaction XIDs */
-   TransactionId xsub[1];      /* assigned subxids */
+   TransactionId xsub[FLEXIBLE_ARRAY_MEMBER];  /* assigned subxids */
 } xl_xact_assignment;
 
 #define MinSizeOfXactAssignment offsetof(xl_xact_assignment, xsub)
@@ -128,7 +128,7 @@ typedef struct xl_xact_commit_compact
    TimestampTz xact_time;      /* time of commit */
    int         nsubxacts;      /* number of subtransaction XIDs */
    /* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */
-   TransactionId subxacts[1];  /* VARIABLE LENGTH ARRAY */
+   TransactionId subxacts[FLEXIBLE_ARRAY_MEMBER];
 } xl_xact_commit_compact;
 
 #define MinSizeOfXactCommitCompact offsetof(xl_xact_commit_compact, subxacts)
@@ -143,7 +143,7 @@ typedef struct xl_xact_commit
    Oid         dbId;           /* MyDatabaseId */
    Oid         tsId;           /* MyDatabaseTableSpace */
    /* Array of RelFileNode(s) to drop at commit */
-   RelFileNode xnodes[1];      /* VARIABLE LENGTH ARRAY */
+   RelFileNode xnodes[FLEXIBLE_ARRAY_MEMBER];
    /* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */
    /* ARRAY OF SHARED INVALIDATION MESSAGES FOLLOWS */
 } xl_xact_commit;
@@ -171,7 +171,7 @@ typedef struct xl_xact_abort
    int         nrels;          /* number of RelFileNodes */
    int         nsubxacts;      /* number of subtransaction XIDs */
    /* Array of RelFileNode(s) to drop at abort */
-   RelFileNode xnodes[1];      /* VARIABLE LENGTH ARRAY */
+   RelFileNode xnodes[FLEXIBLE_ARRAY_MEMBER];
    /* ARRAY OF ABORTED SUBTRANSACTION XIDs FOLLOWS */
 } xl_xact_abort;
 
index b1875209736917a6175682f3e95394ac7204072c..2de86f91416f368ff7cd9260403ef032ae86f9c8 100644 (file)
@@ -424,8 +424,8 @@ typedef struct
    Oid         elemtype;
    int         dim1;
    int         lbound1;
-   int16       values[1];      /* VARIABLE LENGTH ARRAY */
-} int2vector;                  /* VARIABLE LENGTH STRUCT */
+   int16       values[FLEXIBLE_ARRAY_MEMBER];
+} int2vector;
 
 typedef struct
 {
@@ -435,8 +435,8 @@ typedef struct
    Oid         elemtype;
    int         dim1;
    int         lbound1;
-   Oid         values[1];      /* VARIABLE LENGTH ARRAY */
-} oidvector;                   /* VARIABLE LENGTH STRUCT */
+   Oid         values[FLEXIBLE_ARRAY_MEMBER];
+} oidvector;
 
 /*
  * Representation of a Name: effectively just a C string, but null-padded to
index d2e51986a6fbf9109c0d9401dee1d49e9b66ab88..cf5f7d0a785cf361f5fe3faa5a31761316612402 100644 (file)
@@ -34,8 +34,8 @@ typedef struct _FuncCandidateList
    int         nvargs;         /* number of args to become variadic array */
    int         ndargs;         /* number of defaulted args */
    int        *argnumbers;     /* args' positional indexes, if named call */
-   Oid         args[1];        /* arg types --- VARIABLE LENGTH ARRAY */
-}  *FuncCandidateList; /* VARIABLE LENGTH STRUCT */
+   Oid         args[FLEXIBLE_ARRAY_MEMBER];    /* arg types */
+}  *FuncCandidateList;
 
 /*
  * Structure for xxxOverrideSearchPath functions
index cb7cc0e228a4278d6e611e0fb39cbc8742ba811c..4b60cdbedc6823507bf4f8a0a26072880148faa5 100644 (file)
 #define XLOG_DBASE_CREATE      0x00
 #define XLOG_DBASE_DROP            0x10
 
-typedef struct xl_dbase_create_rec_old
-{
-   /* Records copying of a single subdirectory incl. contents */
-   Oid         db_id;
-   char        src_path[1];    /* VARIABLE LENGTH STRING */
-   /* dst_path follows src_path */
-}  xl_dbase_create_rec_old;
-
-typedef struct xl_dbase_drop_rec_old
-{
-   /* Records dropping of a single subdirectory incl. contents */
-   Oid         db_id;
-   char        dir_path[1];    /* VARIABLE LENGTH STRING */
-}  xl_dbase_drop_rec_old;
-
 typedef struct xl_dbase_create_rec
 {
    /* Records copying of a single subdirectory incl. contents */
index e8b9bc407ca707d83e3152b6274459ee7b6af6b1..70734d60301e21ad1fb56eed81e1083d7c235c61 100644 (file)
@@ -25,7 +25,7 @@
 typedef struct xl_tblspc_create_rec
 {
    Oid         ts_id;
-   char        ts_path[1];     /* VARIABLE LENGTH STRING */
+   char        ts_path[FLEXIBLE_ARRAY_MEMBER]; /* null-terminated string */
 } xl_tblspc_create_rec;
 
 typedef struct xl_tblspc_drop_rec
index e79df715dee33c42bdc6695d76b42d53051a78b8..71099b15bbc6eab1300951f3647d4d059279660f 100644 (file)
@@ -114,7 +114,7 @@ typedef struct HashMemoryChunkData
 
    struct HashMemoryChunkData *next; /* pointer to the next chunk (linked list) */
 
-   char        data[1];    /* buffer allocated at the end */
+   char        data[FLEXIBLE_ARRAY_MEMBER];    /* buffer allocated at the end */
 } HashMemoryChunkData;
 
 typedef struct HashMemoryChunkData *HashMemoryChunk;
index 5f45f4dbf36be0146e542980738418b32afda69c..3a556eed0ac66fa7bc320bb190829510108e12de 100644 (file)
@@ -32,8 +32,8 @@ typedef int32 signedbitmapword; /* must be the matching signed type */
 typedef struct Bitmapset
 {
    int         nwords;         /* number of words in array */
-   bitmapword  words[1];       /* really [nwords] */
-} Bitmapset;                   /* VARIABLE LENGTH STRUCT */
+   bitmapword  words[FLEXIBLE_ARRAY_MEMBER];   /* really [nwords] */
+} Bitmapset;
 
 
 /* result of bms_subset_compare */
index 5b096c54b58a3b8600de112a249fa5799c189287..a0f7dd0c555c0adfd0d3e37b4da646cbbe9f5569 100644 (file)
@@ -71,7 +71,7 @@ typedef struct ParamListInfoData
    ParserSetupHook parserSetup;    /* parser setup hook */
    void       *parserSetupArg;
    int         numParams;      /* number of ParamExternDatas following */
-   ParamExternData params[1];  /* VARIABLE LENGTH ARRAY */
+   ParamExternData params[FLEXIBLE_ARRAY_MEMBER];
 }  ParamListInfoData;
 
 
index fb62c9e683c3250db3e8e3f3a839f20f360cb1d5..cfba64b0c5fdd22c295fde4cd688857a52d5ad07 100644 (file)
@@ -41,8 +41,8 @@ typedef struct
    int         ntuples;        /* -1 indicates lossy result */
    bool        recheck;        /* should the tuples be rechecked? */
    /* Note: recheck is always true if ntuples < 0 */
-   OffsetNumber offsets[1];    /* VARIABLE LENGTH ARRAY */
-} TBMIterateResult;                /* VARIABLE LENGTH STRUCT */
+   OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];
+} TBMIterateResult;
 
 /* function prototypes in nodes/tidbitmap.c */
 
index 082c75b0935e6da029150a018249fe0a65b7886a..cbb7f796e1ea553fbe68e64063902d0947d5ff70 100644 (file)
@@ -117,20 +117,20 @@ typedef union
    struct                      /* Normal varlena (4-byte length) */
    {
        uint32      va_header;
-       char        va_data[1];
+       char        va_data[FLEXIBLE_ARRAY_MEMBER];
    }           va_4byte;
    struct                      /* Compressed-in-line format */
    {
        uint32      va_header;
        uint32      va_rawsize; /* Original data size (excludes header) */
-       char        va_data[1]; /* Compressed data */
+       char        va_data[FLEXIBLE_ARRAY_MEMBER];     /* Compressed data */
    }           va_compressed;
 } varattrib_4b;
 
 typedef struct
 {
    uint8       va_header;
-   char        va_data[1];     /* Data begins here */
+   char        va_data[FLEXIBLE_ARRAY_MEMBER]; /* Data begins here */
 } varattrib_1b;
 
 /* TOAST pointers are a subset of varattrib_1b with an identifying tag byte */
@@ -138,7 +138,7 @@ typedef struct
 {
    uint8       va_header;      /* Always 0x80 or 0x01 */
    uint8       va_tag;         /* Type of datum */
-   char        va_data[1];     /* Data (of the type indicated by va_tag) */
+   char        va_data[FLEXIBLE_ARRAY_MEMBER]; /* Type-specific data */
 } varattrib_1b_e;
 
 /*
index 602b13c09760c2f1fcfec6add76d331a8918052e..89a535c18fdef3288f18b30a6eadca18db64b132 100644 (file)
@@ -48,7 +48,7 @@ typedef struct
    int32       pid;            /* writer's pid */
    char        is_last;        /* last chunk of message? 't' or 'f' ('T' or
                                 * 'F' for CSV case) */
-   char        data[1];        /* data payload starts here */
+   char        data[FLEXIBLE_ARRAY_MEMBER];    /* data payload starts here */
 } PipeProtoHeader;
 
 typedef union
index 88677506f34ccd82481af777e8ae16c8a34792b4..40351da47fde2d9049ba7d62d3c2fcb2794588f3 100644 (file)
@@ -54,7 +54,7 @@ typedef struct WalSnd
     * Pointer to the walsender's latch. Used by backends to wake up this
     * walsender when it has work to do. NULL if the walsender isn't active.
     */
-   Latch       *latch;
+   Latch      *latch;
 
    /*
     * The priority order of the standby managed by this WALSender, as listed
@@ -88,7 +88,7 @@ typedef struct
     */
    bool        sync_standbys_defined;
 
-   WalSnd      walsnds[1];     /* VARIABLE LENGTH ARRAY */
+   WalSnd      walsnds[FLEXIBLE_ARRAY_MEMBER];
 } WalSndCtlData;
 
 extern WalSndCtlData *WalSndCtl;
index f69303272494ad34fce98f7472a758f896729925..c2fbffc8e9b72c71addab4a4ad028792d38c70a8 100644 (file)
@@ -156,7 +156,7 @@ typedef struct PageHeaderData
    LocationIndex pd_special;   /* offset to start of special space */
    uint16      pd_pagesize_version;
    TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */
-   ItemIdData  pd_linp[1];     /* beginning of line pointer array */
+   ItemIdData  pd_linp[FLEXIBLE_ARRAY_MEMBER]; /* line pointer array */
 } PageHeaderData;
 
 typedef PageHeaderData *PageHeader;
index 1decd90133189981529970c91e5eb0cbaf08281c..26340b4b2e452af3d74524e982929a72b75256c8 100644 (file)
@@ -39,7 +39,7 @@ typedef struct
     * NonLeafNodesPerPage elements are upper nodes, and the following
     * LeafNodesPerPage elements are leaf nodes. Unused nodes are zero.
     */
-   uint8       fp_nodes[1];
+   uint8       fp_nodes[FLEXIBLE_ARRAY_MEMBER];
 } FSMPageData;
 
 typedef FSMPageData *FSMPage;
index c32c96379c36870fd2896bf5092daef5cb20f8d0..7626c4c4f4bde6f3a59799fb01a6c4178e91db14 100644 (file)
@@ -60,7 +60,7 @@ extern void StandbyReleaseOldLocks(int nxids, TransactionId *xids);
 typedef struct xl_standby_locks
 {
    int         nlocks;         /* number of entries in locks array */
-   xl_standby_lock locks[1];   /* VARIABLE LENGTH ARRAY */
+   xl_standby_lock locks[FLEXIBLE_ARRAY_MEMBER];
 } xl_standby_locks;
 
 /*
@@ -75,7 +75,7 @@ typedef struct xl_running_xacts
    TransactionId oldestRunningXid;     /* *not* oldestXmin */
    TransactionId latestCompletedXid;   /* so we can set xmax */
 
-   TransactionId xids[1];      /* VARIABLE LENGTH ARRAY */
+   TransactionId xids[FLEXIBLE_ARRAY_MEMBER];
 } xl_running_xacts;
 
 #define MinSizeOfXactRunningXacts offsetof(xl_running_xacts, xids)
index 081a502d695a635da3a1115c3db49ec781eea819..ddf5b605c442f97e68baace92e23607666a7d877 100644 (file)
@@ -21,7 +21,7 @@ typedef struct RegisNode
                len:16,
                unused:14;
    struct RegisNode *next;
-   unsigned char data[1];
+   unsigned char data[FLEXIBLE_ARRAY_MEMBER];
 } RegisNode;
 
 #define  RNHDRSZ   (offsetof(RegisNode,data))
index a75552bbebc715b832b37c0f4f923f4c94c7b8f8..e512532f8e85f4228d5de72cef33a0f3964a54b9 100644 (file)
@@ -49,7 +49,7 @@ typedef struct
 typedef struct SPNode
 {
    uint32      length;
-   SPNodeData  data[1];
+   SPNodeData  data[FLEXIBLE_ARRAY_MEMBER];
 } SPNode;
 
 #define SPNHDRSZ   (offsetof(SPNode,data))
@@ -70,7 +70,7 @@ typedef struct spell_struct
            int         len;
        }           d;
    }           p;
-   char        word[1];        /* variable length, null-terminated */
+   char        word[FLEXIBLE_ARRAY_MEMBER];
 } SPELL;
 
 #define SPELLHDRSZ (offsetof(SPELL, word))
@@ -120,7 +120,7 @@ typedef struct AffixNode
 {
    uint32      isvoid:1,
                length:31;
-   AffixNodeData data[1];
+   AffixNodeData data[FLEXIBLE_ARRAY_MEMBER];
 } AffixNode;
 
 #define ANHRDSZ           (offsetof(AffixNode, data))
index 1cdfa82fb07eee2e26523401130d7e7dc4f89073..ce919a2c66530e0a628d530f0f49735ecb11668c 100644 (file)
@@ -63,7 +63,7 @@ typedef uint16 WordEntryPos;
 typedef struct
 {
    uint16      npos;
-   WordEntryPos pos[1];        /* variable length */
+   WordEntryPos pos[FLEXIBLE_ARRAY_MEMBER];
 } WordEntryPosVector;
 
 
@@ -82,7 +82,7 @@ typedef struct
 {
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    int32       size;
-   WordEntry   entries[1];     /* variable length */
+   WordEntry   entries[FLEXIBLE_ARRAY_MEMBER];
    /* lexemes follow the entries[] array */
 } TSVectorData;
 
@@ -233,7 +233,7 @@ typedef struct
 {
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    int32       size;           /* number of QueryItems */
-   char        data[1];        /* data starts here */
+   char        data[FLEXIBLE_ARRAY_MEMBER];    /* data starts here */
 } TSQueryData;
 
 typedef TSQueryData *TSQuery;
index 808478535462c1d9609cb4c8b7a96a3c2a6135a0..a3a699c2fa09445a038faaa42008d5f76367bdb8 100644 (file)
@@ -147,8 +147,8 @@ typedef struct catclist
    uint32      hash_value;     /* hash value for lookup keys */
    HeapTupleData tuple;        /* header for tuple holding keys */
    int         n_members;      /* number of member tuples */
-   CatCTup    *members[1];     /* members --- VARIABLE LENGTH ARRAY */
-} CatCList;                        /* VARIABLE LENGTH STRUCT */
+   CatCTup    *members[FLEXIBLE_ARRAY_MEMBER]; /* members */
+} CatCList;
 
 
 typedef struct catcacheheader
index 8912ba53bff570e3faf1a4a92b971fb403cf56ec..6b8ab3c6564989cfcf410d5077a86278a574c5bc 100644 (file)
@@ -219,7 +219,7 @@ typedef struct TimeZoneAbbrevTable
 {
    Size        tblsize;        /* size in bytes of TimeZoneAbbrevTable */
    int         numabbrevs;     /* number of entries in abbrevs[] array */
-   datetkn     abbrevs[1];     /* VARIABLE LENGTH ARRAY */
+   datetkn     abbrevs[FLEXIBLE_ARRAY_MEMBER];
    /* DynamicZoneAbbrev(s) may follow the abbrevs[] array */
 } TimeZoneAbbrevTable;
 
@@ -227,7 +227,7 @@ typedef struct TimeZoneAbbrevTable
 typedef struct DynamicZoneAbbrev
 {
    pg_tz      *tz;             /* NULL if not yet looked up */
-   char        zone[1];        /* zone name (var length, NUL-terminated) */
+   char        zone[FLEXIBLE_ARRAY_MEMBER];    /* NUL-terminated zone name */
 } DynamicZoneAbbrev;
 
 
index 0b6d3c32d1d251cf846e623eced0a14832fc0241..8da6c6c987b2318d8dc724a2a219fb3ea6e70f44 100644 (file)
@@ -80,7 +80,7 @@ typedef struct
    int32       npts;
    int32       closed;         /* is this a closed polygon? */
    int32       dummy;          /* padding to make it double align */
-   Point       p[1];           /* variable length array of POINTs */
+   Point       p[FLEXIBLE_ARRAY_MEMBER];
 } PATH;
 
 
@@ -115,7 +115,7 @@ typedef struct
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    int32       npts;
    BOX         boundbox;
-   Point       p[1];           /* variable length array of POINTs */
+   Point       p[FLEXIBLE_ARRAY_MEMBER];
 } POLYGON;
 
 /*---------------------------------------------------------------------
index 887eb9b79532844b6ffacfd0ad5156fa8cca0112..9d1770e4c942829df641f6c4378fbf4eb6b56187 100644 (file)
@@ -194,7 +194,7 @@ typedef struct JsonbContainer
 {
    uint32      header;         /* number of elements or key/value pairs, and
                                 * flags */
-   JEntry      children[1];    /* variable length */
+   JEntry      children[FLEXIBLE_ARRAY_MEMBER];
 
    /* the data for each child node follows. */
 } JsonbContainer;
index 420310d6fc6b38133576c829cb9c7009108a3dcc..73b4905e3b14d0bb5ea0326b4b19880d81febd2b 100644 (file)
@@ -29,7 +29,7 @@ typedef struct xl_relmap_update
    Oid         dbid;           /* database ID, or 0 for shared map */
    Oid         tsid;           /* database's tablespace, or pg_global */
    int32       nbytes;         /* size of relmap data */
-   char        data[1];        /* VARIABLE LENGTH ARRAY */
+   char        data[FLEXIBLE_ARRAY_MEMBER];
 } xl_relmap_update;
 
 #define MinSizeOfRelmapUpdate offsetof(xl_relmap_update, data)
index 8afc3b1a6aed6200a555b8c716df5aba07ced4c4..da55e7d0318d8c633f579041270c5b51f4de479c 100644 (file)
@@ -26,7 +26,8 @@ typedef struct
 {
    int32       vl_len_;        /* varlena header (do not touch directly!) */
    int32       bit_len;        /* number of valid bits */
-   bits8       bit_dat[1];     /* bit string, most sig. byte first */
+   bits8       bit_dat[FLEXIBLE_ARRAY_MEMBER]; /* bit string, most sig. byte
+                                                * first */
 } VarBit;
 
 /*