]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix some cases of indirectly casting away const.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 25 Feb 2026 16:19:50 +0000 (11:19 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 25 Feb 2026 16:19:50 +0000 (11:19 -0500)
Newest versions of gcc+glibc are able to detect cases where code
implicitly casts away const by assigning the result of strchr() or
a similar function applied to a "const char *" value to a target
variable that's just "char *".  This of course creates a hazard of
not getting a compiler warning about scribbling on a string one was
not supposed to, so fixing up such cases is good.

This patch fixes a dozen or so places where we were doing that.
Most are trivial additions of "const" to the target variable,
since no actually-hazardous change was occurring.

Thanks to Bertrand Drouvot for finding a couple more spots than
I had.

This commit back-patches relevant portions of 8f1791c61 and
9f7565c6c into supported branches.  However, there are two
places in ecpg (in v18 only) where a proper fix is more
complicated than seems appropriate for a back-patch.  I opted
to silence those two warnings by adding casts.

Author: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Discussion: https://postgr.es/m/1324889.1764886170@sss.pgh.pa.us
Discussion: https://postgr.es/m/3988414.1771950285@sss.pgh.pa.us
Backpatch-through: 14-18

14 files changed:
src/backend/catalog/pg_type.c
src/backend/tsearch/spell.c
src/backend/utils/adt/formatting.c
src/backend/utils/adt/pg_locale.c
src/backend/utils/adt/xid8funcs.c
src/bin/pg_waldump/pg_waldump.c
src/bin/pgbench/pgbench.c
src/common/compression.c
src/interfaces/ecpg/pgtypeslib/datetime.c
src/port/getopt.c
src/port/getopt_long.c
src/port/win32setlocale.c
src/test/regress/pg_regress.c
src/timezone/zic.c

index 395dec8ed88e8906e72f8b805405bb0f27835c9b..3316f88c144d42ba74e10c16d433273e698f5049 100644 (file)
@@ -950,7 +950,7 @@ char *
 makeMultirangeTypeName(const char *rangeTypeName, Oid typeNamespace)
 {
        char       *buf;
-       char       *rangestr;
+       const char *rangestr;
 
        /*
         * If the range type name contains "range" then change that to
index 5a80a5023b6d362be6c57b3d50ac78e1518fa61e..0a0d7bd328c4eba488357b958d8f9af7eb1f00a3 100644 (file)
@@ -2308,7 +2308,7 @@ CheckCompoundAffixes(CMPDAffix **ptr, char *word, int len, bool CheckInPlace)
        }
        else
        {
-               char       *affbegin;
+               const char *affbegin;
 
                while ((*ptr)->affix)
                {
index 080b9d823ebc69d3451a43d26d2effb884f365c5..f35e12b3a0431e37f3630836ff7b8a200a732dad 100644 (file)
@@ -1012,8 +1012,9 @@ typedef struct NUMProc
        char       *number,                     /* string with number   */
                           *number_p,           /* pointer to current number position */
                           *inout,                      /* in / out buffer      */
-                          *inout_p,            /* pointer to current inout position */
-                          *last_relevant,      /* last relevant number after decimal point */
+                          *inout_p;            /* pointer to current inout position */
+
+       const char *last_relevant,      /* last relevant number after decimal point */
 
                           *L_negative_sign,    /* Locale */
                           *L_positive_sign,
index d2b16d81fe3bac99afc57d33ee12c1315dc493c0..c95b550b7ab3275dcdf3c9067e76db2c461ad6d6 100644 (file)
@@ -1129,7 +1129,7 @@ get_iso_localename(const char *winlocname)
        wchar_t         wc_locale_name[LOCALE_NAME_MAX_LENGTH];
        wchar_t         buffer[LOCALE_NAME_MAX_LENGTH];
        static char iso_lc_messages[LOCALE_NAME_MAX_LENGTH];
-       char       *period;
+       const char *period;
        int                     len;
        int                     ret_val;
 
index 25f28ed8cecc2bb0c61ad677dd0177a217a00d27..41e356e9df73ac3fc64391262d9a7fc1a4365126 100644 (file)
@@ -193,7 +193,7 @@ is_visible_fxid(FullTransactionId value, const pg_snapshot *snap)
 #ifdef USE_BSEARCH_IF_NXIP_GREATER
        else if (snap->nxip > USE_BSEARCH_IF_NXIP_GREATER)
        {
-               void       *res;
+               const void *res;
 
                res = bsearch(&value, snap->xip, snap->nxip, sizeof(FullTransactionId),
                                          cmp_fxid);
index 1f9403fc5cf4b613c5f976ca36ad04fbe996e197..e46b5cd1ee1df7505f157a7b38a000e3d497fe70 100644 (file)
@@ -160,7 +160,7 @@ create_fullpage_directory(char *path)
 static void
 split_path(const char *path, char **dir, char **fname)
 {
-       char       *sep;
+       const char *sep;
 
        /* split filepath into directory & filename */
        sep = strrchr(path, '/');
index 91df96935e0a9d85b1d730cda795f2a1047d583c..eb3700c1bf61bfddc33dd730bc3c216a8adcd967 100644 (file)
@@ -6229,7 +6229,7 @@ findBuiltin(const char *name)
 static int
 parseScriptWeight(const char *option, char **script)
 {
-       char       *sep;
+       const char *sep;
        int                     weight;
 
        if ((sep = strrchr(option, WSEP)))
index 52e9ed01fbc540dbdffcc879434f65ff544284a9..0950a78eed808003ed304198a3a33d05d7ca49dc 100644 (file)
@@ -425,7 +425,7 @@ validate_compress_specification(pg_compress_specification *spec)
 void
 parse_compress_options(const char *option, char **algorithm, char **detail)
 {
-       char       *sep;
+       const char *sep;
        char       *endp;
        long            result;
 
index 1b253747fc403d7134cf9d2117c482c3c6590429..f43343b459499b53baa3fd6ea297e529fb37d4f7 100644 (file)
@@ -335,8 +335,8 @@ PGTYPESdate_defmt_asc(date * d, const char *fmt, const char *str)
         */
        int                     token[3][2];
        int                     token_values[3] = {-1, -1, -1};
-       char       *fmt_token_order;
-       char       *fmt_ystart,
+       const char *fmt_token_order;
+       const char *fmt_ystart,
                           *fmt_mstart,
                           *fmt_dstart;
        unsigned int i;
index 207c2836d354b9d66413b57a7ae7c632b66b02a9..3e101a7217e77face0572e356469af30e101041f 100644 (file)
@@ -71,7 +71,7 @@ int
 getopt(int nargc, char *const *nargv, const char *ostr)
 {
        static char *place = EMSG;      /* option letter processing */
-       char       *oli;                        /* option letter list index */
+       const char *oli;                        /* option letter list index */
 
        if (!*place)
        {                                                       /* update scanning pointer */
index f83de0dff97894647fff582753d71cb12ab1157d..20953db9db1e649e31bfd51810d9fdec18033d24 100644 (file)
@@ -62,7 +62,7 @@ getopt_long(int argc, char *const argv[],
                        const struct option *longopts, int *longindex)
 {
        static char *place = EMSG;      /* option letter processing */
-       char       *oli;                        /* option letter list index */
+       const char *oli;                        /* option letter list index */
        static int      nonopt_start = -1;
        static bool force_nonopt = false;
 
index 9e2ab8cc3ad0178f2a2e48c309050bed83ee0e7c..bf11c6acdc24674a8d49a82f05e4556267c41d9e 100644 (file)
@@ -119,9 +119,9 @@ map_locale(const struct locale_map *map, const char *locale)
                const char *needle_start = map[i].locale_name_start;
                const char *needle_end = map[i].locale_name_end;
                const char *replacement = map[i].replacement;
-               char       *match;
-               char       *match_start = NULL;
-               char       *match_end = NULL;
+               const char *match;
+               const char *match_start = NULL;
+               const char *match_end = NULL;
 
                match = strstr(locale, needle_start);
                if (match)
@@ -148,7 +148,7 @@ map_locale(const struct locale_map *map, const char *locale)
                        /* Found a match. Replace the matched string. */
                        int                     matchpos = match_start - locale;
                        int                     replacementlen = strlen(replacement);
-                       char       *rest = match_end;
+                       const char *rest = match_end;
                        int                     restlen = strlen(rest);
 
                        /* check that the result fits in the static buffer */
index 53435c474200bb0bb958b40865a8a2cbef9389f7..e695c4c660d9aa07a5c7f9dbcf4bf22699dc9d12 100644 (file)
@@ -688,7 +688,7 @@ static
 const char *
 get_expectfile(const char *testname, const char *file)
 {
-       char       *file_type;
+       const char *file_type;
        _resultmap *rm;
 
        /*
index d605c721ecf703379d0b990a1b04187dd5989cce..7e134645c7da4aea5957ed8410d0602f93725c55 100644 (file)
@@ -2631,7 +2631,7 @@ doabbr(char *abbr, struct zone const *zp, char const *letters,
           bool isdst, zic_t save, bool doquotes)
 {
        char       *cp;
-       char       *slashp;
+       char const *slashp;
        size_t          len;
        char const *format = zp->z_format;