mirror of
https://github.com/postgres/postgres.git
synced 2025-12-07 12:02:30 +03:00
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 <tgl@sss.pgh.pa.us> Reviewed-by: Bertrand Drouvot <bertranddrouvot.pg@gmail.com> Discussion: https://postgr.es/m/1324889.1764886170@sss.pgh.pa.us
This commit is contained in:
@@ -948,7 +948,7 @@ char *
|
|||||||
makeMultirangeTypeName(const char *rangeTypeName, Oid typeNamespace)
|
makeMultirangeTypeName(const char *rangeTypeName, Oid typeNamespace)
|
||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
char *rangestr;
|
const char *rangestr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the range type name contains "range" then change that to
|
* If the range type name contains "range" then change that to
|
||||||
|
|||||||
@@ -2320,7 +2320,7 @@ CheckCompoundAffixes(CMPDAffix **ptr, const char *word, int len, bool CheckInPla
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *affbegin;
|
const char *affbegin;
|
||||||
|
|
||||||
while ((*ptr)->affix)
|
while ((*ptr)->affix)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1046,8 +1046,9 @@ typedef struct NUMProc
|
|||||||
char *number, /* string with number */
|
char *number, /* string with number */
|
||||||
*number_p, /* pointer to current number position */
|
*number_p, /* pointer to current number position */
|
||||||
*inout, /* in / out buffer */
|
*inout, /* in / out buffer */
|
||||||
*inout_p, /* pointer to current inout position */
|
*inout_p; /* pointer to current inout position */
|
||||||
*last_relevant, /* last relevant number after decimal point */
|
|
||||||
|
const char *last_relevant, /* last relevant number after decimal point */
|
||||||
|
|
||||||
*L_negative_sign, /* Locale */
|
*L_negative_sign, /* Locale */
|
||||||
*L_positive_sign,
|
*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 char *int_to_roman(int number);
|
||||||
static int roman_to_int(NUMProc *Np, size_t input_len);
|
static int roman_to_int(NUMProc *Np, size_t input_len);
|
||||||
static void NUM_prepare_locale(NUMProc *Np);
|
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_from_char(NUMProc *Np, int id, size_t input_len);
|
||||||
static void NUM_numpart_to_char(NUMProc *Np, int id);
|
static void NUM_numpart_to_char(NUMProc *Np, int id);
|
||||||
static char *NUM_processor(FormatNode *node, NUMDesc *Num, char *inout,
|
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
|
* If there is no decimal point, return NULL (which will result in same
|
||||||
* behavior as if FM hadn't been specified).
|
* behavior as if FM hadn't been specified).
|
||||||
*/
|
*/
|
||||||
static char *
|
static const char *
|
||||||
get_last_relevant_decnum(const char *num)
|
get_last_relevant_decnum(const char *num)
|
||||||
{
|
{
|
||||||
char *result,
|
const char *result,
|
||||||
*p = strchr(num, '.');
|
*p = strchr(num, '.');
|
||||||
|
|
||||||
#ifdef DEBUG_TO_FROM_CHAR
|
#ifdef DEBUG_TO_FROM_CHAR
|
||||||
|
|||||||
@@ -953,7 +953,7 @@ get_iso_localename(const char *winlocname)
|
|||||||
wchar_t wc_locale_name[LOCALE_NAME_MAX_LENGTH];
|
wchar_t wc_locale_name[LOCALE_NAME_MAX_LENGTH];
|
||||||
wchar_t buffer[LOCALE_NAME_MAX_LENGTH];
|
wchar_t buffer[LOCALE_NAME_MAX_LENGTH];
|
||||||
static char iso_lc_messages[LOCALE_NAME_MAX_LENGTH];
|
static char iso_lc_messages[LOCALE_NAME_MAX_LENGTH];
|
||||||
char *period;
|
const char *period;
|
||||||
int len;
|
int len;
|
||||||
int ret_val;
|
int ret_val;
|
||||||
|
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ is_visible_fxid(FullTransactionId value, const pg_snapshot *snap)
|
|||||||
#ifdef USE_BSEARCH_IF_NXIP_GREATER
|
#ifdef USE_BSEARCH_IF_NXIP_GREATER
|
||||||
else if (snap->nxip > 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),
|
res = bsearch(&value, snap->xip, snap->nxip, sizeof(FullTransactionId),
|
||||||
cmp_fxid);
|
cmp_fxid);
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ create_fullpage_directory(char *path)
|
|||||||
static void
|
static void
|
||||||
split_path(const char *path, char **dir, char **fname)
|
split_path(const char *path, char **dir, char **fname)
|
||||||
{
|
{
|
||||||
char *sep;
|
const char *sep;
|
||||||
|
|
||||||
/* split filepath into directory & filename */
|
/* split filepath into directory & filename */
|
||||||
sep = strrchr(path, '/');
|
sep = strrchr(path, '/');
|
||||||
|
|||||||
@@ -6254,7 +6254,7 @@ findBuiltin(const char *name)
|
|||||||
static int
|
static int
|
||||||
parseScriptWeight(const char *option, char **script)
|
parseScriptWeight(const char *option, char **script)
|
||||||
{
|
{
|
||||||
char *sep;
|
const char *sep;
|
||||||
int weight;
|
int weight;
|
||||||
|
|
||||||
if ((sep = strrchr(option, WSEP)))
|
if ((sep = strrchr(option, WSEP)))
|
||||||
|
|||||||
@@ -425,7 +425,7 @@ validate_compress_specification(pg_compress_specification *spec)
|
|||||||
void
|
void
|
||||||
parse_compress_options(const char *option, char **algorithm, char **detail)
|
parse_compress_options(const char *option, char **algorithm, char **detail)
|
||||||
{
|
{
|
||||||
char *sep;
|
const char *sep;
|
||||||
char *endp;
|
char *endp;
|
||||||
long result;
|
long result;
|
||||||
|
|
||||||
|
|||||||
@@ -335,8 +335,8 @@ PGTYPESdate_defmt_asc(date * d, const char *fmt, const char *str)
|
|||||||
*/
|
*/
|
||||||
int token[3][2];
|
int token[3][2];
|
||||||
int token_values[3] = {-1, -1, -1};
|
int token_values[3] = {-1, -1, -1};
|
||||||
char *fmt_token_order;
|
const char *fmt_token_order;
|
||||||
char *fmt_ystart,
|
const char *fmt_ystart,
|
||||||
*fmt_mstart,
|
*fmt_mstart,
|
||||||
*fmt_dstart;
|
*fmt_dstart;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|||||||
@@ -1975,12 +1975,14 @@ civarind: cvariable indicator
|
|||||||
|
|
||||||
char_civar: char_variable
|
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
|
if (ptr) /* varchar, we need the struct name here, not
|
||||||
* the struct element */
|
* the struct element */
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
add_variable_to_head(&argsinsert, find_variable(@1), &no_indicator);
|
add_variable_to_head(&argsinsert, find_variable(var), &no_indicator);
|
||||||
|
@$ = var;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ static char *
|
|||||||
win32_get_codeset(const char *ctype)
|
win32_get_codeset(const char *ctype)
|
||||||
{
|
{
|
||||||
char *r = NULL;
|
char *r = NULL;
|
||||||
char *codepage;
|
const char *codepage;
|
||||||
uint32 cp;
|
uint32 cp;
|
||||||
WCHAR wctype[LOCALE_NAME_MAX_LENGTH];
|
WCHAR wctype[LOCALE_NAME_MAX_LENGTH];
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ getopt_long(int argc, char *const argv[],
|
|||||||
const struct option *longopts, int *longindex)
|
const struct option *longopts, int *longindex)
|
||||||
{
|
{
|
||||||
static char *place = EMSG; /* option letter processing */
|
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 int nonopt_start = -1;
|
||||||
static bool force_nonopt = false;
|
static bool force_nonopt = false;
|
||||||
|
|
||||||
|
|||||||
@@ -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_start = map[i].locale_name_start;
|
||||||
const char *needle_end = map[i].locale_name_end;
|
const char *needle_end = map[i].locale_name_end;
|
||||||
const char *replacement = map[i].replacement;
|
const char *replacement = map[i].replacement;
|
||||||
char *match;
|
const char *match;
|
||||||
char *match_start = NULL;
|
const char *match_start = NULL;
|
||||||
char *match_end = NULL;
|
const char *match_end = NULL;
|
||||||
|
|
||||||
match = strstr(locale, needle_start);
|
match = strstr(locale, needle_start);
|
||||||
if (match)
|
if (match)
|
||||||
@@ -148,7 +148,7 @@ map_locale(const struct locale_map *map, const char *locale)
|
|||||||
/* Found a match. Replace the matched string. */
|
/* Found a match. Replace the matched string. */
|
||||||
int matchpos = match_start - locale;
|
int matchpos = match_start - locale;
|
||||||
int replacementlen = strlen(replacement);
|
int replacementlen = strlen(replacement);
|
||||||
char *rest = match_end;
|
const char *rest = match_end;
|
||||||
int restlen = strlen(rest);
|
int restlen = strlen(rest);
|
||||||
|
|
||||||
/* check that the result fits in the static buffer */
|
/* check that the result fits in the static buffer */
|
||||||
|
|||||||
@@ -693,7 +693,7 @@ static
|
|||||||
const char *
|
const char *
|
||||||
get_expectfile(const char *testname, const char *file)
|
get_expectfile(const char *testname, const char *file)
|
||||||
{
|
{
|
||||||
char *file_type;
|
const char *file_type;
|
||||||
_resultmap *rm;
|
_resultmap *rm;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -2620,7 +2620,7 @@ doabbr(char *abbr, struct zone const *zp, char const *letters,
|
|||||||
bool isdst, zic_t save, bool doquotes)
|
bool isdst, zic_t save, bool doquotes)
|
||||||
{
|
{
|
||||||
char *cp;
|
char *cp;
|
||||||
char *slashp;
|
char const *slashp;
|
||||||
size_t len;
|
size_t len;
|
||||||
char const *format = zp->z_format;
|
char const *format = zp->z_format;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user