Fix the warnings created by the compiler warning options
-Wformat-overflow=2 -Wformat-truncation=2, supported since GCC 7. This
is a more aggressive variant of the fixes in
6275f5d28a1577563f53f2171689d4f890a46881, which GCC 7 warned about by
default.
The issues are all harmless, but some dubious coding patterns are
cleaned up.
One issue that is of external interest is that BGW_MAXLEN is increased
from 64 to 96. Apparently, the old value would cause the bgw_name of
logical replication workers to be truncated in some circumstances.
But this doesn't actually add those warning options. It appears that
the warnings depend a bit on compilation and optimization options, so it
would be annoying to have to keep up with that. This is more of a
once-in-a-while cleanup.
Reviewed-by: Michael Paquier <michael@paquier.xyz>
build_pgstattuple_type(pgstattuple_type *stat, FunctionCallInfo fcinfo)
{
#define NCOLUMNS 9
-#define NCHARS 32
+#define NCHARS 314
HeapTuple tuple;
char *values[NCOLUMNS];
ExplainPropertyFloat(const char *qlabel, double value, int ndigits,
ExplainState *es)
{
- char buf[256];
+ char *buf;
- snprintf(buf, sizeof(buf), "%.*f", ndigits, value);
+ buf = psprintf("%.*f", ndigits, value);
ExplainProperty(qlabel, buf, true, es);
+ pfree(buf);
}
/*
SSLerrmessage(unsigned long ecode)
{
const char *errreason;
- static char errbuf[32];
+ static char errbuf[36];
if (ecode == 0)
return _("no SSL error reported");
DIR *dirdesc;
struct dirent *direntry;
char dirpath[MAXPGPATH];
- char pathname[MAXPGPATH + 12 + sizeof(TABLESPACE_VERSION_DIRECTORY)];
+ char pathname[MAXPGPATH + 21 + sizeof(TABLESPACE_VERSION_DIRECTORY)];
AclResult aclresult;
/*
#define NAN (*(const double *) nan)
#endif
-/* not sure what the following should be, but better to make it over-sufficient */
-#define MAXFLOATWIDTH 64
-#define MAXDOUBLEWIDTH 128
-
/*
* check to see if a float4/8 val has underflowed or overflowed
*/
float4out(PG_FUNCTION_ARGS)
{
float4 num = PG_GETARG_FLOAT4(0);
- char *ascii = (char *) palloc(MAXFLOATWIDTH + 1);
+ char *ascii;
if (isnan(num))
- PG_RETURN_CSTRING(strcpy(ascii, "NaN"));
+ PG_RETURN_CSTRING(pstrdup("NaN"));
switch (is_infinite(num))
{
case 1:
- strcpy(ascii, "Infinity");
+ ascii = pstrdup("Infinity");
break;
case -1:
- strcpy(ascii, "-Infinity");
+ ascii = pstrdup("-Infinity");
break;
default:
{
if (ndig < 1)
ndig = 1;
- snprintf(ascii, MAXFLOATWIDTH + 1, "%.*g", ndig, num);
+ ascii = psprintf("%.*g", ndig, num);
}
}
char *
float8out_internal(double num)
{
- char *ascii = (char *) palloc(MAXDOUBLEWIDTH + 1);
+ char *ascii;
if (isnan(num))
- return strcpy(ascii, "NaN");
+ return pstrdup("NaN");
switch (is_infinite(num))
{
case 1:
- strcpy(ascii, "Infinity");
+ ascii = pstrdup("Infinity");
break;
case -1:
- strcpy(ascii, "-Infinity");
+ ascii = pstrdup("-Infinity");
break;
default:
{
if (ndig < 1)
ndig = 1;
- snprintf(ascii, MAXDOUBLEWIDTH + 1, "%.*g", ndig, num);
+ ascii = psprintf("%.*g", ndig, num);
}
}
#define DCH_MAX_ITEM_SIZ 12 /* max localized day name */
#define NUM_MAX_ITEM_SIZ 8 /* roman number (RN has 15 chars) */
-/* ----------
- * More is in float.c
- * ----------
- */
-#define MAXFLOATWIDTH 60
-#define MAXDOUBLEWIDTH 500
-
/* ----------
* Format parser structs
tmfc.tzm < 0 || tmfc.tzm >= MINS_PER_HOUR)
DateTimeParseError(DTERR_TZDISP_OVERFLOW, date_str, "timestamp");
- tz = palloc(7);
-
- snprintf(tz, 7, "%c%02d:%02d",
+ tz = psprintf("%c%02d:%02d",
tmfc.tzsign > 0 ? '+' : '-', tmfc.tzh, tmfc.tzm);
tm->tm_zone = tz;
num = 0;
char *p = NULL,
*result,
- numstr[5];
+ numstr[12];
result = (char *) palloc(16);
*result = '\0';
/* we can do it easily because float8 won't lose any precision */
float8 val = (float8) value;
- orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
- snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%+.*e", Num.post, val);
+ orgnum = (char *) psprintf("%+.*e", Num.post, val);
/*
* Swap a leading positive sign for a space.
numstr = orgnum = int_to_roman((int) rint(value));
else if (IS_EEEE(&Num))
{
- numstr = orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
if (isnan(value) || is_infinite(value))
{
/*
}
else
{
- snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%+.*e", Num.post, value);
+ numstr = orgnum = psprintf("%+.*e", Num.post, value);
/*
* Swap a leading positive sign for a space.
Num.pre += Num.multi;
}
- orgnum = (char *) palloc(MAXFLOATWIDTH + 1);
- snprintf(orgnum, MAXFLOATWIDTH + 1, "%.0f", fabs(val));
+ orgnum = (char *) psprintf("%.0f", fabs(val));
numstr_pre_len = strlen(orgnum);
/* adjust post digits to fit max float digits */
Num.post = 0;
else if (numstr_pre_len + Num.post > FLT_DIG)
Num.post = FLT_DIG - numstr_pre_len;
- snprintf(orgnum, MAXFLOATWIDTH + 1, "%.*f", Num.post, val);
+ orgnum = psprintf("%.*f", Num.post, val);
if (*orgnum == '-')
{ /* < 0 */
numstr = orgnum = int_to_roman((int) rint(value));
else if (IS_EEEE(&Num))
{
- numstr = orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
if (isnan(value) || is_infinite(value))
{
/*
}
else
{
- snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%+.*e", Num.post, value);
+ numstr = orgnum = (char *) psprintf("%+.*e", Num.post, value);
/*
* Swap a leading positive sign for a space.
val = value * multi;
Num.pre += Num.multi;
}
- orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
- numstr_pre_len = snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.0f", fabs(val));
+ orgnum = psprintf("%.0f", fabs(val));
+ numstr_pre_len = strlen(orgnum);
/* adjust post digits to fit max double digits */
if (numstr_pre_len >= DBL_DIG)
Num.post = 0;
else if (numstr_pre_len + Num.post > DBL_DIG)
Num.post = DBL_DIG - numstr_pre_len;
- snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.*f", Num.post, val);
+ orgnum = psprintf("%.*f", Num.post, val);
if (*orgnum == '-')
{ /* < 0 */
static const char *
show_unix_socket_permissions(void)
{
- static char buf[8];
+ static char buf[12];
snprintf(buf, sizeof(buf), "%04o", Unix_socket_permissions);
return buf;
static const char *
show_log_file_mode(void)
{
- static char buf[8];
+ static char buf[12];
snprintf(buf, sizeof(buf), "%04o", Log_file_mode);
return buf;
pretty_wal_size(int segment_count)
{
int sz = wal_segment_size_mb * segment_count;
- char *result = pg_malloc(11);
+ char *result = pg_malloc(14);
if ((sz % 1024) == 0)
- snprintf(result, 11, "%dGB", sz / 1024);
+ snprintf(result, 14, "%dGB", sz / 1024);
else
- snprintf(result, 11, "%dMB", sz);
+ snprintf(result, 14, "%dMB", sz);
return result;
}
#ifdef HAVE_LIBZ
if (compression != 0)
{
- char fmode[10];
+ char fmode[14];
/* Don't use PG_BINARY_x since this is zlib */
sprintf(fmode, "wb%d", compression);
TAR_MEMBER *tm;
#ifdef HAVE_LIBZ
- char fmode[10];
+ char fmode[14];
#endif
if (mode == 'r')
p = sql;
while ((p = strchr(p, ':')) != NULL)
{
- char var[12];
+ char var[13];
char *name;
int eaten;
sqlat,
lag,
stdev;
- char tbuf[64];
+ char tbuf[315];
/*
* Add up the statistics of all threads.
#define BGW_DEFAULT_RESTART_INTERVAL 60
#define BGW_NEVER_RESTART -1
-#define BGW_MAXLEN 64
+#define BGW_MAXLEN 96
#define BGW_EXTRALEN 128
typedef struct BackgroundWorker
if (strcmp(attribute_name, "key_bits") == 0)
{
- static char sslbits_str[10];
+ static char sslbits_str[12];
int sslbits;
SSL_get_cipher_bits(conn->ssl, &sslbits);
Datum prosrcdatum;
bool isnull;
char *proc_source;
- char buf[32];
+ char buf[48];
Tcl_Interp *interp;
int i;
int tcl_rc;