summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2025-12-05 16:17:14 +0000
committerTom Lane2025-12-05 16:17:23 +0000
commit8f1791c61836d213acbf85d368c8762705ad9d51 (patch)
tree857fe32b3f934592827f6c0f705c7ce3b82f0713
parenta4a0fa0c7587eb05b36c1f184d966dd5524a4b74 (diff)
Fix some cases of indirectly casting away const.
Newest versions of gcc 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. There is one place in ecpg.trailer where we were indeed violating the intention of not modifying a string passed in as "const char *". I believe that's harmless not a live bug, but let's fix it by copying the string before modifying it. There is a remaining trouble spot in ecpg/preproc/variable.c, which requires more complex surgery. I've left that out of this commit because I want to study that code a bit more first. We probably will want to back-patch this once compilers that detect this pattern get into wider circulation, but for now I'm just going to apply it to master to see what the buildfarm says. Thanks to Bertrand Drouvot for finding a couple more spots than I had. Author: Tom Lane <[email protected]> Reviewed-by: Bertrand Drouvot <[email protected]> Discussion: https://postgr.es/m/[email protected]
-rw-r--r--src/backend/catalog/pg_type.c2
-rw-r--r--src/backend/tsearch/spell.c2
-rw-r--r--src/backend/utils/adt/formatting.c11
-rw-r--r--src/backend/utils/adt/pg_locale.c2
-rw-r--r--src/backend/utils/adt/xid8funcs.c2
-rw-r--r--src/bin/pg_waldump/pg_waldump.c2
-rw-r--r--src/bin/pgbench/pgbench.c2
-rw-r--r--src/common/compression.c2
-rw-r--r--src/interfaces/ecpg/pgtypeslib/datetime.c4
-rw-r--r--src/interfaces/ecpg/preproc/ecpg.trailer6
-rw-r--r--src/port/chklocale.c2
-rw-r--r--src/port/getopt_long.c2
-rw-r--r--src/port/win32setlocale.c8
-rw-r--r--src/test/regress/pg_regress.c2
-rw-r--r--src/timezone/zic.c2
15 files changed, 27 insertions, 24 deletions
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
index 257c7da8568..4a69a81b9fb 100644
--- a/src/backend/catalog/pg_type.c
+++ b/src/backend/catalog/pg_type.c
@@ -948,7 +948,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
diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c
index 146801885d7..0dab31f0ddb 100644
--- a/src/backend/tsearch/spell.c
+++ b/src/backend/tsearch/spell.c
@@ -2320,7 +2320,7 @@ CheckCompoundAffixes(CMPDAffix **ptr, const char *word, int len, bool CheckInPla
}
else
{
- char *affbegin;
+ const char *affbegin;
while ((*ptr)->affix)
{
diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
index 5bfeda2ffde..c3cb022a400 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -1046,8 +1046,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,
@@ -1118,7 +1119,7 @@ static FormatNode *NUM_cache(int len, NUMDesc *Num, const text *pars_str, bool *
static char *int_to_roman(int number);
static int roman_to_int(NUMProc *Np, size_t input_len);
static void NUM_prepare_locale(NUMProc *Np);
-static char *get_last_relevant_decnum(const char *num);
+static const char *get_last_relevant_decnum(const char *num);
static void NUM_numpart_from_char(NUMProc *Np, int id, size_t input_len);
static void NUM_numpart_to_char(NUMProc *Np, int id);
static char *NUM_processor(FormatNode *node, NUMDesc *Num, char *inout,
@@ -5297,10 +5298,10 @@ NUM_prepare_locale(NUMProc *Np)
* If there is no decimal point, return NULL (which will result in same
* behavior as if FM hadn't been specified).
*/
-static char *
+static const char *
get_last_relevant_decnum(const char *num)
{
- char *result,
+ const char *result,
*p = strchr(num, '.');
#ifdef DEBUG_TO_FROM_CHAR
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index b26257c0a8d..d73bab97c15 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -953,7 +953,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;
diff --git a/src/backend/utils/adt/xid8funcs.c b/src/backend/utils/adt/xid8funcs.c
index a211a107767..4b3f7a69b3b 100644
--- a/src/backend/utils/adt/xid8funcs.c
+++ b/src/backend/utils/adt/xid8funcs.c
@@ -194,7 +194,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);
diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c
index c6d6ba79e44..1c1ccf59f65 100644
--- a/src/bin/pg_waldump/pg_waldump.c
+++ b/src/bin/pg_waldump/pg_waldump.c
@@ -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, '/');
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 68774a59efd..00593fab5e1 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -6254,7 +6254,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)))
diff --git a/src/common/compression.c b/src/common/compression.c
index 4c3c9fd7b50..eb434542fbd 100644
--- a/src/common/compression.c
+++ b/src/common/compression.c
@@ -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;
diff --git a/src/interfaces/ecpg/pgtypeslib/datetime.c b/src/interfaces/ecpg/pgtypeslib/datetime.c
index 1b253747fc4..f43343b4594 100644
--- a/src/interfaces/ecpg/pgtypeslib/datetime.c
+++ b/src/interfaces/ecpg/pgtypeslib/datetime.c
@@ -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;
diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer
index 6f94b832a03..e4c13fdd2b6 100644
--- a/src/interfaces/ecpg/preproc/ecpg.trailer
+++ b/src/interfaces/ecpg/preproc/ecpg.trailer
@@ -1975,12 +1975,14 @@ civarind: cvariable indicator
char_civar: char_variable
{
- char *ptr = strstr(@1, ".arr");
+ char *var = loc_strdup(@1);
+ char *ptr = strstr(var, ".arr");
if (ptr) /* varchar, we need the struct name here, not
* the struct element */
*ptr = '\0';
- add_variable_to_head(&argsinsert, find_variable(@1), &no_indicator);
+ add_variable_to_head(&argsinsert, find_variable(var), &no_indicator);
+ @$ = var;
}
;
diff --git a/src/port/chklocale.c b/src/port/chklocale.c
index 034939f7fd2..023a7435c9b 100644
--- a/src/port/chklocale.c
+++ b/src/port/chklocale.c
@@ -202,7 +202,7 @@ static char *
win32_get_codeset(const char *ctype)
{
char *r = NULL;
- char *codepage;
+ const char *codepage;
uint32 cp;
WCHAR wctype[LOCALE_NAME_MAX_LENGTH];
diff --git a/src/port/getopt_long.c b/src/port/getopt_long.c
index f83de0dff97..20953db9db1 100644
--- a/src/port/getopt_long.c
+++ b/src/port/getopt_long.c
@@ -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;
diff --git a/src/port/win32setlocale.c b/src/port/win32setlocale.c
index 7c0982439db..6e084946132 100644
--- a/src/port/win32setlocale.c
+++ b/src/port/win32setlocale.c
@@ -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 */
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index efc41fca2ba..58d41207605 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -693,7 +693,7 @@ static
const char *
get_expectfile(const char *testname, const char *file)
{
- char *file_type;
+ const char *file_type;
_resultmap *rm;
/*
diff --git a/src/timezone/zic.c b/src/timezone/zic.c
index a8c1de9910d..8dcc7b337a7 100644
--- a/src/timezone/zic.c
+++ b/src/timezone/zic.c
@@ -2620,7 +2620,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;