more unconstify use
Here is a patch that makes more use of unconstify() by replacing casts
whose only purpose is to cast away const. Also a preliminary patch to
remove casts that were useless to begin with.
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachments:
v1-0001-Remove-useless-casts.patchtext/plain; charset=UTF-8; name=v1-0001-Remove-useless-casts.patch; x-mac-creator=0; x-mac-type=0Download
From e874e9fde3371bedbb8c5301a966c082a8369e2c Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Tue, 29 Jan 2019 01:12:18 +0100
Subject: [PATCH v1 1/5] Remove useless casts
Some of these were uselessly casting away "const", some were just
nearby, but they where all unnecessary anyway.
---
contrib/btree_gist/btree_utils_num.c | 24 ++++++++++++------------
src/backend/catalog/heap.c | 2 +-
src/common/unicode_norm.c | 2 +-
3 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/contrib/btree_gist/btree_utils_num.c b/contrib/btree_gist/btree_utils_num.c
index 29b0faf997..4d10bc93f3 100644
--- a/contrib/btree_gist/btree_utils_num.c
+++ b/contrib/btree_gist/btree_utils_num.c
@@ -185,10 +185,10 @@ gbt_num_union(GBT_NUMKEY *out, const GistEntryVector *entryvec, const gbtree_nin
c.upper = &cur[tinfo->size];
/* if out->lower > cur->lower, adopt cur as lower */
if (tinfo->f_gt(o.lower, c.lower, flinfo))
- memcpy((void *) o.lower, (void *) c.lower, tinfo->size);
+ memcpy((void *) o.lower, c.lower, tinfo->size);
/* if out->upper < cur->upper, adopt cur as upper */
if (tinfo->f_lt(o.upper, c.upper, flinfo))
- memcpy((void *) o.upper, (void *) c.upper, tinfo->size);
+ memcpy((void *) o.upper, c.upper, tinfo->size);
}
return out;
@@ -206,10 +206,10 @@ gbt_num_same(const GBT_NUMKEY *a, const GBT_NUMKEY *b, const gbtree_ninfo *tinfo
GBT_NUMKEY_R b1,
b2;
- b1.lower = &(((GBT_NUMKEY *) a)[0]);
- b1.upper = &(((GBT_NUMKEY *) a)[tinfo->size]);
- b2.lower = &(((GBT_NUMKEY *) b)[0]);
- b2.upper = &(((GBT_NUMKEY *) b)[tinfo->size]);
+ b1.lower = &(a[0]);
+ b1.upper = &(a[tinfo->size]);
+ b2.lower = &(b[0]);
+ b2.upper = &(b[tinfo->size]);
return (tinfo->f_eq(b1.lower, b2.lower, flinfo) &&
tinfo->f_eq(b1.upper, b2.upper, flinfo));
@@ -227,8 +227,8 @@ gbt_num_bin_union(Datum *u, GBT_NUMKEY *e, const gbtree_ninfo *tinfo, FmgrInfo *
if (!DatumGetPointer(*u))
{
*u = PointerGetDatum(palloc0(tinfo->indexsize));
- memcpy((void *) &(((GBT_NUMKEY *) DatumGetPointer(*u))[0]), (void *) rd.lower, tinfo->size);
- memcpy((void *) &(((GBT_NUMKEY *) DatumGetPointer(*u))[tinfo->size]), (void *) rd.upper, tinfo->size);
+ memcpy(&(((GBT_NUMKEY *) DatumGetPointer(*u))[0]), rd.lower, tinfo->size);
+ memcpy(&(((GBT_NUMKEY *) DatumGetPointer(*u))[tinfo->size]), rd.upper, tinfo->size);
}
else
{
@@ -236,10 +236,10 @@ gbt_num_bin_union(Datum *u, GBT_NUMKEY *e, const gbtree_ninfo *tinfo, FmgrInfo *
ur.lower = &(((GBT_NUMKEY *) DatumGetPointer(*u))[0]);
ur.upper = &(((GBT_NUMKEY *) DatumGetPointer(*u))[tinfo->size]);
- if (tinfo->f_gt((void *) ur.lower, (void *) rd.lower, flinfo))
- memcpy((void *) ur.lower, (void *) rd.lower, tinfo->size);
- if (tinfo->f_lt((void *) ur.upper, (void *) rd.upper, flinfo))
- memcpy((void *) ur.upper, (void *) rd.upper, tinfo->size);
+ if (tinfo->f_gt(ur.lower, rd.lower, flinfo))
+ memcpy((void *) ur.lower, rd.lower, tinfo->size);
+ if (tinfo->f_lt(ur.upper, rd.upper, flinfo))
+ memcpy((void *) ur.upper, rd.upper, tinfo->size);
}
}
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 06d18a1cfb..d0215a5eed 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -777,7 +777,7 @@ AddNewAttributeTuples(Oid new_rel_oid,
{
FormData_pg_attribute attStruct;
- memcpy(&attStruct, (char *) SysAtt[i], sizeof(FormData_pg_attribute));
+ memcpy(&attStruct, SysAtt[i], sizeof(FormData_pg_attribute));
/* Fill in the correct relation OID in the copied tuple */
attStruct.attrelid = new_rel_oid;
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index d5f6d32e0f..6281f2222f 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -59,7 +59,7 @@ static pg_unicode_decomposition *
get_code_entry(pg_wchar code)
{
return bsearch(&(code),
- (void *) UnicodeDecompMain,
+ UnicodeDecompMain,
lengthof(UnicodeDecompMain),
sizeof(pg_unicode_decomposition),
conv_compare);
base-commit: 793c736d69091d385a967b2740cc93cfb7a7b076
--
2.20.1
v1-0002-More-unconstify-use.patchtext/plain; charset=UTF-8; name=v1-0002-More-unconstify-use.patch; x-mac-creator=0; x-mac-type=0Download
From 8dc004406f742dce9c76d0b922f45fdfda174ea3 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Tue, 29 Jan 2019 01:16:24 +0100
Subject: [PATCH v1 2/5] More unconstify use
Replace casts whose only purpose is to cast away const with the
unconstify() macro.
---
contrib/btree_gist/btree_utils_num.c | 8 ++++----
contrib/pgcrypto/imath.c | 2 +-
contrib/pgcrypto/md5.c | 2 +-
contrib/pgcrypto/pgp-compress.c | 2 +-
src/backend/access/brin/brin_pageops.c | 8 ++++----
src/backend/access/transam/xact.c | 4 ++--
src/backend/executor/spi.c | 10 +++++-----
src/backend/libpq/auth.c | 10 +++++-----
src/backend/libpq/be-secure-openssl.c | 2 +-
src/backend/parser/parse_type.c | 2 +-
src/backend/replication/logical/message.c | 4 ++--
src/backend/tcop/postgres.c | 2 +-
src/backend/utils/adt/formatting.c | 2 +-
src/backend/utils/mb/mbutils.c | 20 ++++++++++----------
src/backend/utils/misc/guc.c | 2 +-
src/bin/pg_basebackup/pg_basebackup.c | 2 +-
src/bin/pg_basebackup/walmethods.c | 2 +-
src/bin/pg_dump/compress_io.c | 2 +-
src/bin/psql/prompt.c | 2 +-
src/fe_utils/print.c | 2 +-
src/interfaces/libpq/fe-lobj.c | 2 +-
src/interfaces/libpq/pqexpbuffer.c | 8 +++++---
src/pl/tcl/pltcl.c | 4 ++--
src/port/path.c | 6 +++---
src/timezone/localtime.c | 2 +-
25 files changed, 57 insertions(+), 55 deletions(-)
diff --git a/contrib/btree_gist/btree_utils_num.c b/contrib/btree_gist/btree_utils_num.c
index 4d10bc93f3..7564a403c7 100644
--- a/contrib/btree_gist/btree_utils_num.c
+++ b/contrib/btree_gist/btree_utils_num.c
@@ -185,10 +185,10 @@ gbt_num_union(GBT_NUMKEY *out, const GistEntryVector *entryvec, const gbtree_nin
c.upper = &cur[tinfo->size];
/* if out->lower > cur->lower, adopt cur as lower */
if (tinfo->f_gt(o.lower, c.lower, flinfo))
- memcpy((void *) o.lower, c.lower, tinfo->size);
+ memcpy(unconstify(GBT_NUMKEY *, o.lower), c.lower, tinfo->size);
/* if out->upper < cur->upper, adopt cur as upper */
if (tinfo->f_lt(o.upper, c.upper, flinfo))
- memcpy((void *) o.upper, c.upper, tinfo->size);
+ memcpy(unconstify(GBT_NUMKEY *, o.upper), c.upper, tinfo->size);
}
return out;
@@ -237,9 +237,9 @@ gbt_num_bin_union(Datum *u, GBT_NUMKEY *e, const gbtree_ninfo *tinfo, FmgrInfo *
ur.lower = &(((GBT_NUMKEY *) DatumGetPointer(*u))[0]);
ur.upper = &(((GBT_NUMKEY *) DatumGetPointer(*u))[tinfo->size]);
if (tinfo->f_gt(ur.lower, rd.lower, flinfo))
- memcpy((void *) ur.lower, rd.lower, tinfo->size);
+ memcpy(unconstify(GBT_NUMKEY *, ur.lower), rd.lower, tinfo->size);
if (tinfo->f_lt(ur.upper, rd.upper, flinfo))
- memcpy((void *) ur.upper, rd.upper, tinfo->size);
+ memcpy(unconstify(GBT_NUMKEY *, ur.upper), rd.upper, tinfo->size);
}
}
diff --git a/contrib/pgcrypto/imath.c b/contrib/pgcrypto/imath.c
index b94a51b81a..c267ea6ab3 100644
--- a/contrib/pgcrypto/imath.c
+++ b/contrib/pgcrypto/imath.c
@@ -2050,7 +2050,7 @@ mp_int_read_cstring(mp_int z, mp_size radix, const char *str, char **end)
MP_SIGN(z) = MP_ZPOS;
if (end != NULL)
- *end = (char *) str;
+ *end = unconstify(char *, str);
/*
* Return a truncation error if the string has unprocessed characters
diff --git a/contrib/pgcrypto/md5.c b/contrib/pgcrypto/md5.c
index cac4e408ab..5bcfbfe28f 100644
--- a/contrib/pgcrypto/md5.c
+++ b/contrib/pgcrypto/md5.c
@@ -161,7 +161,7 @@ md5_loop(md5_ctxt *ctxt, const uint8 *input, unsigned len)
md5_calc(ctxt->md5_buf, ctxt);
for (i = gap; i + MD5_BUFLEN <= len; i += MD5_BUFLEN)
- md5_calc((uint8 *) (input + i), ctxt);
+ md5_calc(unconstify(uint8 *, (input + i)), ctxt);
ctxt->md5_i = len - i;
memmove(ctxt->md5_buf, input + i, ctxt->md5_i);
diff --git a/contrib/pgcrypto/pgp-compress.c b/contrib/pgcrypto/pgp-compress.c
index 57efe73338..eaeb221877 100644
--- a/contrib/pgcrypto/pgp-compress.c
+++ b/contrib/pgcrypto/pgp-compress.c
@@ -117,7 +117,7 @@ compress_process(PushFilter *next, void *priv, const uint8 *data, int len)
*/
while (len > 0)
{
- st->stream.next_in = (void *) data;
+ st->stream.next_in = unconstify(uint8 *, data);
st->stream.avail_in = len;
st->stream.next_out = st->buf;
st->stream.avail_out = st->buf_len;
diff --git a/src/backend/access/brin/brin_pageops.c b/src/backend/access/brin/brin_pageops.c
index 2eb354f948..2e83aa42f7 100644
--- a/src/backend/access/brin/brin_pageops.c
+++ b/src/backend/access/brin/brin_pageops.c
@@ -178,7 +178,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
brin_can_do_samepage_update(oldbuf, origsz, newsz))
{
START_CRIT_SECTION();
- if (!PageIndexTupleOverwrite(oldpage, oldoff, (Item) newtup, newsz))
+ if (!PageIndexTupleOverwrite(oldpage, oldoff, (Item) unconstify(BrinTuple *, newtup), newsz))
elog(ERROR, "failed to replace BRIN tuple");
MarkBufferDirty(oldbuf);
@@ -195,7 +195,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
XLogRegisterData((char *) &xlrec, SizeOfBrinSamepageUpdate);
XLogRegisterBuffer(0, oldbuf, REGBUF_STANDARD);
- XLogRegisterBufData(0, (char *) newtup, newsz);
+ XLogRegisterBufData(0, (char *) unconstify(BrinTuple *, newtup), newsz);
recptr = XLogInsert(RM_BRIN_ID, info);
@@ -252,7 +252,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
brin_page_init(newpage, BRIN_PAGETYPE_REGULAR);
PageIndexTupleDeleteNoCompact(oldpage, oldoff);
- newoff = PageAddItem(newpage, (Item) newtup, newsz,
+ newoff = PageAddItem(newpage, (Item) unconstify(BrinTuple *, newtup), newsz,
InvalidOffsetNumber, false, false);
if (newoff == InvalidOffsetNumber)
elog(ERROR, "failed to add BRIN tuple to new page");
@@ -287,7 +287,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
XLogRegisterData((char *) &xlrec, SizeOfBrinUpdate);
XLogRegisterBuffer(0, newbuf, REGBUF_STANDARD | (extended ? REGBUF_WILL_INIT : 0));
- XLogRegisterBufData(0, (char *) newtup, newsz);
+ XLogRegisterBufData(0, (char *) unconstify(BrinTuple *, newtup), newsz);
/* revmap page */
XLogRegisterBuffer(1, revmapbuf, 0);
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 92bda87804..e93262975d 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -5409,7 +5409,7 @@ XactLogCommitRecord(TimestampTz commit_time,
{
XLogRegisterData((char *) (&xl_twophase), sizeof(xl_xact_twophase));
if (xl_xinfo.xinfo & XACT_XINFO_HAS_GID)
- XLogRegisterData((char *) twophase_gid, strlen(twophase_gid) + 1);
+ XLogRegisterData(unconstify(char *, twophase_gid), strlen(twophase_gid) + 1);
}
if (xl_xinfo.xinfo & XACT_XINFO_HAS_ORIGIN)
@@ -5537,7 +5537,7 @@ XactLogAbortRecord(TimestampTz abort_time,
{
XLogRegisterData((char *) (&xl_twophase), sizeof(xl_xact_twophase));
if (xl_xinfo.xinfo & XACT_XINFO_HAS_GID)
- XLogRegisterData((char *) twophase_gid, strlen(twophase_gid) + 1);
+ XLogRegisterData(unconstify(char *, twophase_gid), strlen(twophase_gid) + 1);
}
if (xl_xinfo.xinfo & XACT_XINFO_HAS_ORIGIN)
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 94a53e0e3f..70c03e0f60 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -1314,7 +1314,7 @@ SPI_cursor_open_internal(const char *name, SPIPlanPtr plan,
* throws an error.
*/
spierrcontext.callback = _SPI_error_callback;
- spierrcontext.arg = (void *) plansource->query_string;
+ spierrcontext.arg = unconstify(char *, plansource->query_string);
spierrcontext.previous = error_context_stack;
error_context_stack = &spierrcontext;
@@ -1753,7 +1753,7 @@ SPI_plan_get_cached_plan(SPIPlanPtr plan)
/* Setup error traceback support for ereport() */
spierrcontext.callback = _SPI_error_callback;
- spierrcontext.arg = (void *) plansource->query_string;
+ spierrcontext.arg = unconstify(char *, plansource->query_string);
spierrcontext.previous = error_context_stack;
error_context_stack = &spierrcontext;
@@ -1884,7 +1884,7 @@ _SPI_prepare_plan(const char *src, SPIPlanPtr plan)
* Setup error traceback support for ereport()
*/
spierrcontext.callback = _SPI_error_callback;
- spierrcontext.arg = (void *) src;
+ spierrcontext.arg = unconstify(char *, src);
spierrcontext.previous = error_context_stack;
error_context_stack = &spierrcontext;
@@ -1989,7 +1989,7 @@ _SPI_prepare_oneshot_plan(const char *src, SPIPlanPtr plan)
* Setup error traceback support for ereport()
*/
spierrcontext.callback = _SPI_error_callback;
- spierrcontext.arg = (void *) src;
+ spierrcontext.arg = unconstify(char *, src);
spierrcontext.previous = error_context_stack;
error_context_stack = &spierrcontext;
@@ -2100,7 +2100,7 @@ _SPI_execute_plan(SPIPlanPtr plan, ParamListInfo paramLI,
List *stmt_list;
ListCell *lc2;
- spierrcontext.arg = (void *) plansource->query_string;
+ spierrcontext.arg = unconstify(char *, plansource->query_string);
/*
* If this is a one-shot plan, we still need to do parse analysis.
diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c
index 20fe98fb82..c42f7b8fe6 100644
--- a/src/backend/libpq/auth.c
+++ b/src/backend/libpq/auth.c
@@ -867,7 +867,7 @@ CheckSCRAMAuth(Port *port, char *shadow_pass, char **logdetail)
void *scram_opaq = NULL;
char *output = NULL;
int outputlen = 0;
- char *input;
+ const char *input;
int inputlen;
int result;
bool initial;
@@ -964,14 +964,14 @@ CheckSCRAMAuth(Port *port, char *shadow_pass, char **logdetail)
if (inputlen == -1)
input = NULL;
else
- input = (char *) pq_getmsgbytes(&buf, inputlen);
+ input = pq_getmsgbytes(&buf, inputlen);
initial = false;
}
else
{
inputlen = buf.len;
- input = (char *) pq_getmsgbytes(&buf, buf.len);
+ input = pq_getmsgbytes(&buf, buf.len);
}
pq_getmsgend(&buf);
@@ -985,7 +985,7 @@ CheckSCRAMAuth(Port *port, char *shadow_pass, char **logdetail)
* we pass 'logdetail' as NULL when doing a mock authentication,
* because we should already have a better error message in that case
*/
- result = pg_be_scram_exchange(scram_opaq, input, inputlen,
+ result = pg_be_scram_exchange(scram_opaq, unconstify(char *, input), inputlen,
&output, &outputlen,
logdetail);
@@ -2175,7 +2175,7 @@ CheckPAMAuth(Port *port, const char *user, const char *password)
* later used inside the PAM conversation to pass the password to the
* authentication module.
*/
- pam_passw_conv.appdata_ptr = (char *) password; /* from password above,
+ pam_passw_conv.appdata_ptr = unconstify(char *, password); /* from password above,
* not allocated */
/* Optionally, one can set the service name in pg_hba.conf */
diff --git a/src/backend/libpq/be-secure-openssl.c b/src/backend/libpq/be-secure-openssl.c
index a2779543ec..3a3d041039 100644
--- a/src/backend/libpq/be-secure-openssl.c
+++ b/src/backend/libpq/be-secure-openssl.c
@@ -854,7 +854,7 @@ load_dh_buffer(const char *buffer, size_t len)
BIO *bio;
DH *dh = NULL;
- bio = BIO_new_mem_buf((char *) buffer, len);
+ bio = BIO_new_mem_buf(unconstify(char *, buffer), len);
if (bio == NULL)
return NULL;
dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c
index 8d57e83ac6..5d554633d2 100644
--- a/src/backend/parser/parse_type.c
+++ b/src/backend/parser/parse_type.c
@@ -739,7 +739,7 @@ typeStringToTypeName(const char *str)
* Setup error traceback support in case of ereport() during parse
*/
ptserrcontext.callback = pts_error_callback;
- ptserrcontext.arg = (void *) str;
+ ptserrcontext.arg = unconstify(char *, str);
ptserrcontext.previous = error_context_stack;
error_context_stack = &ptserrcontext;
diff --git a/src/backend/replication/logical/message.c b/src/backend/replication/logical/message.c
index 4b13189dde..0681cb4a2a 100644
--- a/src/backend/replication/logical/message.c
+++ b/src/backend/replication/logical/message.c
@@ -69,8 +69,8 @@ LogLogicalMessage(const char *prefix, const char *message, size_t size,
XLogBeginInsert();
XLogRegisterData((char *) &xlrec, SizeOfLogicalMessage);
- XLogRegisterData((char *) prefix, xlrec.prefix_size);
- XLogRegisterData((char *) message, size);
+ XLogRegisterData(unconstify(char *, prefix), xlrec.prefix_size);
+ XLogRegisterData(unconstify(char *, message), size);
/* allow origin filtering */
XLogSetRecordFlags(XLOG_INCLUDE_ORIGIN);
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 36cfd507b2..8b4d94c9a1 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -1767,7 +1767,7 @@ exec_bind_message(StringInfo input_message)
* trailing null. This is grotty but is a big win when
* dealing with very large parameter strings.
*/
- pbuf.data = (char *) pvalue;
+ pbuf.data = unconstify(char *, pvalue);
pbuf.maxlen = plength + 1;
pbuf.len = plength;
pbuf.cursor = 0;
diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
index 096d862c1d..df1db7bc9f 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -3688,7 +3688,7 @@ to_timestamp(PG_FUNCTION_ARGS)
/* Use the specified time zone, if any. */
if (tm.tm_zone)
{
- int dterr = DecodeTimezone((char *) tm.tm_zone, &tz);
+ int dterr = DecodeTimezone(unconstify(char *, tm.tm_zone), &tz);
if (dterr)
DateTimeParseError(dterr, text_to_cstring(date_txt), "timestamptz");
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index c8e5571d97..aa18c9ad3d 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -464,7 +464,7 @@ pg_convert(PG_FUNCTION_ARGS)
pg_verify_mbstr_len(src_encoding, src_str, len, false);
/* perform conversion */
- dest_str = (char *) pg_do_encoding_conversion((unsigned char *) src_str,
+ dest_str = (char *) pg_do_encoding_conversion((unsigned char *) unconstify(char *, src_str),
len,
src_encoding,
dest_encoding);
@@ -561,7 +561,7 @@ char *
pg_any_to_server(const char *s, int len, int encoding)
{
if (len <= 0)
- return (char *) s; /* empty string is always valid */
+ return unconstify(char *, s); /* empty string is always valid */
if (encoding == DatabaseEncoding->encoding ||
encoding == PG_SQL_ASCII)
@@ -570,7 +570,7 @@ pg_any_to_server(const char *s, int len, int encoding)
* No conversion is needed, but we must still validate the data.
*/
(void) pg_verify_mbstr(DatabaseEncoding->encoding, s, len, false);
- return (char *) s;
+ return unconstify(char *, s);
}
if (DatabaseEncoding->encoding == PG_SQL_ASCII)
@@ -600,7 +600,7 @@ pg_any_to_server(const char *s, int len, int encoding)
(unsigned char) s[i])));
}
}
- return (char *) s;
+ return unconstify(char *, s);
}
/* Fast path if we can use cached conversion function */
@@ -608,7 +608,7 @@ pg_any_to_server(const char *s, int len, int encoding)
return perform_default_encoding_conversion(s, len, true);
/* General case ... will not work outside transactions */
- return (char *) pg_do_encoding_conversion((unsigned char *) s,
+ return (char *) pg_do_encoding_conversion((unsigned char *) unconstify(char *, s),
len,
encoding,
DatabaseEncoding->encoding);
@@ -634,17 +634,17 @@ char *
pg_server_to_any(const char *s, int len, int encoding)
{
if (len <= 0)
- return (char *) s; /* empty string is always valid */
+ return unconstify(char *, s); /* empty string is always valid */
if (encoding == DatabaseEncoding->encoding ||
encoding == PG_SQL_ASCII)
- return (char *) s; /* assume data is valid */
+ return unconstify(char *, s); /* assume data is valid */
if (DatabaseEncoding->encoding == PG_SQL_ASCII)
{
/* No conversion is possible, but we must validate the result */
(void) pg_verify_mbstr(encoding, s, len, false);
- return (char *) s;
+ return unconstify(char *, s);
}
/* Fast path if we can use cached conversion function */
@@ -652,7 +652,7 @@ pg_server_to_any(const char *s, int len, int encoding)
return perform_default_encoding_conversion(s, len, false);
/* General case ... will not work outside transactions */
- return (char *) pg_do_encoding_conversion((unsigned char *) s,
+ return (char *) pg_do_encoding_conversion((unsigned char *) unconstify(char *, s),
len,
DatabaseEncoding->encoding,
encoding);
@@ -687,7 +687,7 @@ perform_default_encoding_conversion(const char *src, int len,
}
if (flinfo == NULL)
- return (char *) src;
+ return unconstify(char *, src);
/*
* Allocate space for conversion result, being wary of integer overflow
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 8681ada33a..57595cfb95 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -4897,7 +4897,7 @@ add_placeholder_variable(const char *name, int elevel)
if (!add_guc_variable((struct config_generic *) var, elevel))
{
- free((void *) gen->name);
+ free(unconstify(char *, gen->name));
free(var);
return NULL;
}
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
index 594d67c9e9..3d2d4cd0b9 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -1970,7 +1970,7 @@ BaseBackup(void)
*/
if (format == 'p' && !PQgetisnull(res, i, 1))
{
- char *path = (char *) get_tablespace_mapping(PQgetvalue(res, i, 1));
+ char *path = unconstify(char *, get_tablespace_mapping(PQgetvalue(res, i, 1)));
verify_dir_is_empty_or_create(path, &made_tablespace_dirs, &found_tablespace_dirs);
}
diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c
index 7410af3e63..165b3a1e89 100644
--- a/src/bin/pg_basebackup/walmethods.c
+++ b/src/bin/pg_basebackup/walmethods.c
@@ -496,7 +496,7 @@ tar_write(Walfile f, const void *buf, size_t count)
#ifdef HAVE_LIBZ
else
{
- if (!tar_write_compressed_data((void *) buf, count, false))
+ if (!tar_write_compressed_data(unconstify(void *, buf), count, false))
return -1;
((TarMethodFile *) f)->currpos += count;
return count;
diff --git a/src/bin/pg_dump/compress_io.c b/src/bin/pg_dump/compress_io.c
index e34e6c5618..d904ec62ad 100644
--- a/src/bin/pg_dump/compress_io.c
+++ b/src/bin/pg_dump/compress_io.c
@@ -312,7 +312,7 @@ static void
WriteDataToArchiveZlib(ArchiveHandle *AH, CompressorState *cs,
const char *data, size_t dLen)
{
- cs->zp->next_in = (void *) data;
+ cs->zp->next_in = (void *) unconstify(char *, data);
cs->zp->avail_in = dLen;
DeflateCompressorZlib(AH, cs, false);
diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c
index 73394dc828..4514cf8551 100644
--- a/src/bin/psql/prompt.c
+++ b/src/bin/psql/prompt.c
@@ -181,7 +181,7 @@ get_prompt(promptStatus_t status, ConditionalStack cstack)
case '5':
case '6':
case '7':
- *buf = (char) strtol(p, (char **) &p, 8);
+ *buf = (char) strtol(p, unconstify(char **, &p), 8);
--p;
break;
case 'R':
diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c
index 4f84c24dac..779a95e8bc 100644
--- a/src/fe_utils/print.c
+++ b/src/fe_utils/print.c
@@ -3250,7 +3250,7 @@ printTableCleanup(printTableContent *const content)
for (i = 0; i < content->nrows * content->ncolumns; i++)
{
if (content->cellmustfree[i])
- free((char *) content->cells[i]);
+ free(unconstify(char *, content->cells[i]));
}
free(content->cellmustfree);
content->cellmustfree = NULL;
diff --git a/src/interfaces/libpq/fe-lobj.c b/src/interfaces/libpq/fe-lobj.c
index 3c6f11a7d7..6866d64538 100644
--- a/src/interfaces/libpq/fe-lobj.c
+++ b/src/interfaces/libpq/fe-lobj.c
@@ -341,7 +341,7 @@ lo_write(PGconn *conn, int fd, const char *buf, size_t len)
argv[1].isint = 0;
argv[1].len = (int) len;
- argv[1].u.ptr = (int *) buf;
+ argv[1].u.ptr = (int *) unconstify(char *, buf);
res = PQfn(conn, conn->lobjfuncs->fn_lo_write,
&retval, &result_len, 1, argv, 2);
diff --git a/src/interfaces/libpq/pqexpbuffer.c b/src/interfaces/libpq/pqexpbuffer.c
index 498f82bd99..dc7c3ea07d 100644
--- a/src/interfaces/libpq/pqexpbuffer.c
+++ b/src/interfaces/libpq/pqexpbuffer.c
@@ -36,6 +36,8 @@
/* All "broken" PQExpBuffers point to this string. */
static const char oom_buffer[1] = "";
+/* Need a char * for unconstify() compatiblity */
+static const char * oom_buffer_ptr = oom_buffer;
static bool appendPQExpBufferVA(PQExpBuffer str, const char *fmt, va_list args) pg_attribute_printf(2, 0);
@@ -57,7 +59,7 @@ markPQExpBufferBroken(PQExpBuffer str)
* to put oom_buffer in read-only storage, so that anyone who tries to
* scribble on a broken PQExpBuffer will get a failure.
*/
- str->data = (char *) oom_buffer;
+ str->data = unconstify(char *, oom_buffer_ptr);
str->len = 0;
str->maxlen = 0;
}
@@ -91,7 +93,7 @@ initPQExpBuffer(PQExpBuffer str)
str->data = (char *) malloc(INITIAL_EXPBUFFER_SIZE);
if (str->data == NULL)
{
- str->data = (char *) oom_buffer; /* see comment above */
+ str->data = unconstify(char *, oom_buffer_ptr); /* see comment above */
str->maxlen = 0;
str->len = 0;
}
@@ -130,7 +132,7 @@ termPQExpBuffer(PQExpBuffer str)
if (str->data != oom_buffer)
free(str->data);
/* just for luck, make the buffer validly empty. */
- str->data = (char *) oom_buffer; /* see comment above */
+ str->data = unconstify(char *, oom_buffer_ptr); /* see comment above */
str->maxlen = 0;
str->len = 0;
}
diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c
index bfbf62305c..76c9afc339 100644
--- a/src/pl/tcl/pltcl.c
+++ b/src/pl/tcl/pltcl.c
@@ -610,7 +610,7 @@ call_pltcl_start_proc(Oid prolang, bool pltrusted)
/* Set up errcontext callback to make errors more helpful */
errcallback.callback = start_proc_error_callback;
- errcallback.arg = (void *) gucname;
+ errcallback.arg = unconstify(char *, gucname);
errcallback.previous = error_context_stack;
error_context_stack = &errcallback;
@@ -3081,7 +3081,7 @@ pltcl_set_tuple_values(Tcl_Interp *interp, const char *arrayname,
else
Tcl_UnsetVar2(interp, *arrptr, *nameptr, 0);
- pfree((char *) attname);
+ pfree(unconstify(char *, attname));
}
}
diff --git a/src/port/path.c b/src/port/path.c
index 661017f877..4b214e89e4 100644
--- a/src/port/path.c
+++ b/src/port/path.c
@@ -106,7 +106,7 @@ first_dir_separator(const char *filename)
for (p = skip_drive(filename); *p; p++)
if (IS_DIR_SEP(*p))
- return (char *) p;
+ return unconstify(char *, p);
return NULL;
}
@@ -124,7 +124,7 @@ first_path_var_separator(const char *pathlist)
/* skip_drive is not needed */
for (p = pathlist; *p; p++)
if (IS_PATH_VAR_SEP(*p))
- return (char *) p;
+ return unconstify(char *, p);
return NULL;
}
@@ -143,7 +143,7 @@ last_dir_separator(const char *filename)
for (p = skip_drive(filename); *p; p++)
if (IS_DIR_SEP(*p))
ret = p;
- return (char *) ret;
+ return unconstify(char *, ret);
}
diff --git a/src/timezone/localtime.c b/src/timezone/localtime.c
index 96e62aff3b..9fe43135fe 100644
--- a/src/timezone/localtime.c
+++ b/src/timezone/localtime.c
@@ -1364,7 +1364,7 @@ localsub(struct state const *sp, pg_time_t const *timep,
if (result)
{
result->tm_isdst = ttisp->tt_isdst;
- result->tm_zone = (char *) &sp->chars[ttisp->tt_abbrind];
+ result->tm_zone = unconstify(char *, &sp->chars[ttisp->tt_abbrind]);
}
return result;
}
--
2.20.1
On 07/02/2019 09:14, Peter Eisentraut wrote:
Here is a patch that makes more use of unconstify() by replacing casts
whose only purpose is to cast away const. Also a preliminary patch to
remove casts that were useless to begin with.
committed
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On Feb 7, 2019, at 12:14 AM, Peter Eisentraut <peter.eisentraut@2ndquadrant.com> wrote:
Here is a patch that makes more use of unconstify() by replacing casts
whose only purpose is to cast away const. Also a preliminary patch to
remove casts that were useless to begin with.--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
<v1-0001-Remove-useless-casts.patch><v1-0002-More-unconstify-use.patch>
Peter, so sorry I did not review this patch before you committed. There
are a few places where you unconstify the argument to a function where
changing the function to take const seems better to me. I argued for
something similar in 2016,
/messages/by-id/ACF3A030-E3D5-4E68-B744-184E11DE68F3@gmail.com
Back then, Tom replied
I'd call this kind of a wash, I guess. I'd be more excited about it if
the change allowed removal of an actual cast-away-of-constness somewhere.
We'd be able to remove some of these unconstify calls, and perhaps that
meets Tom's criteria from that thread.
Your change:
- md5_calc((uint8 *) (input + i), ctxt);
+ md5_calc(unconstify(uint8 *, (input + i)), ctxt);
Perhaps md5_calc's signature should change to
md5_calc(const uint8 *, md5_ctxt *)
since it doesn't modify the first argument.
Your change:
- if (!PageIndexTupleOverwrite(oldpage, oldoff, (Item) newtup, newsz))
+ if (!PageIndexTupleOverwrite(oldpage, oldoff, (Item) unconstify(BrinTuple *, newtup), newsz))
Perhaps PageIndexTupleOverwrite's third argument should be const, since it
only uses it as the const source of a memcpy. (This is a bit harder than
for md5_calc, above, since the third argument here is of type Item, which
is itself a typedef to Pointer, and there exists no analogous ConstPointer
or ConstItem definition in the sources.)
Your change:
- XLogRegisterBufData(0, (char *) newtup, newsz);
+ XLogRegisterBufData(0, (char *) unconstify(BrinTuple *, newtup), newsz);
Perhaps the third argument to XLogRegisterBufData can be changed to const,
with the extra work of changing XLogRecData's data field to const. I'm not
sure about the amount of code churn this would entail.
Your change:
- newoff = PageAddItem(newpage, (Item) newtup, newsz,
+ newoff = PageAddItem(newpage, (Item) unconstify(BrinTuple *, newtup), newsz,
InvalidOffsetNumber, false, false);
As with PageIndexTupleOverwrite's third argument, the second argument to
PageAddItem is only ever used as the const source of a memcpy.
Your change:
- XLogRegisterData((char *) twophase_gid, strlen(twophase_gid) + 1);
+ XLogRegisterData(unconstify(char *, twophase_gid), strlen(twophase_gid) + 1);
The first argument here gets assigned to XLogRecData.data, similarly to what is done
above in XLogRegisterBufData. This is another place where casting away const could
be avoided if we accepted the code churn cost of changing XLogRecData's data field
to const. There are a few more of these in your patch which for brevity I won't quote.
Your change:
- result = pg_be_scram_exchange(scram_opaq, input, inputlen,
+ result = pg_be_scram_exchange(scram_opaq, unconstify(char *, input), inputlen,
&output, &outputlen,
logdetail);
pg_be_scram_exchange passes the second argument into two functions,
read_client_first_message and read_client_final_message, both of which take
it as a non-const argument but immediately pstrdup it such that it might
as well have been const. Perhaps we should just clean up this mess rather
than unconstifying.
mark
On 13/02/2019 19:51, Mark Dilger wrote:
Peter, so sorry I did not review this patch before you committed. There
are a few places where you unconstify the argument to a function where
changing the function to take const seems better to me. I argued for
something similar in 2016,
One can consider unconstify a "todo" marker. Some of these could be
removed by some API changes. It needs case-by-case consideration.
Your change:
- md5_calc((uint8 *) (input + i), ctxt); + md5_calc(unconstify(uint8 *, (input + i)), ctxt);Perhaps md5_calc's signature should change to
md5_calc(const uint8 *, md5_ctxt *)
since it doesn't modify the first argument.
Fixed, thanks.
Your change:
- if (!PageIndexTupleOverwrite(oldpage, oldoff, (Item) newtup, newsz)) + if (!PageIndexTupleOverwrite(oldpage, oldoff, (Item) unconstify(BrinTuple *, newtup), newsz))Perhaps PageIndexTupleOverwrite's third argument should be const, since it
only uses it as the const source of a memcpy. (This is a bit harder than
for md5_calc, above, since the third argument here is of type Item, which
is itself a typedef to Pointer, and there exists no analogous ConstPointer
or ConstItem definition in the sources.)
Yeah, typedefs to a pointer are a poor fit for this. We have been
getting rid of them from time to time, but I don't know a general solution.
Your change:
- XLogRegisterBufData(0, (char *) newtup, newsz); + XLogRegisterBufData(0, (char *) unconstify(BrinTuple *, newtup), newsz);Perhaps the third argument to XLogRegisterBufData can be changed to const,
with the extra work of changing XLogRecData's data field to const. I'm not
sure about the amount of code churn this would entail.
IIRC, the XLogRegister stuff is a web of lies with respect to constness.
Resolving this properly is tricky.
Your change:
- result = pg_be_scram_exchange(scram_opaq, input, inputlen, + result = pg_be_scram_exchange(scram_opaq, unconstify(char *, input), inputlen, &output, &outputlen, logdetail);pg_be_scram_exchange passes the second argument into two functions,
read_client_first_message and read_client_final_message, both of which take
it as a non-const argument but immediately pstrdup it such that it might
as well have been const. Perhaps we should just clean up this mess rather
than unconstifying.
Also fixed!
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services