Fix more format truncation issues

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
6275f5d28a, 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>
This commit is contained in:
Peter Eisentraut 2018-03-15 11:10:41 -04:00
parent 648a6c7bd8
commit 3a4b891964
14 changed files with 38 additions and 54 deletions

View File

@ -89,7 +89,7 @@ static Datum
build_pgstattuple_type(pgstattuple_type *stat, FunctionCallInfo fcinfo) build_pgstattuple_type(pgstattuple_type *stat, FunctionCallInfo fcinfo)
{ {
#define NCOLUMNS 9 #define NCOLUMNS 9
#define NCHARS 32 #define NCHARS 314
HeapTuple tuple; HeapTuple tuple;
char *values[NCOLUMNS]; char *values[NCOLUMNS];

View File

@ -3337,10 +3337,11 @@ void
ExplainPropertyFloat(const char *qlabel, double value, int ndigits, ExplainPropertyFloat(const char *qlabel, double value, int ndigits,
ExplainState *es) ExplainState *es)
{ {
char buf[256]; char *buf;
snprintf(buf, sizeof(buf), "%.*f", ndigits, value); buf = psprintf("%.*f", ndigits, value);
ExplainProperty(qlabel, buf, true, es); ExplainProperty(qlabel, buf, true, es);
pfree(buf);
} }
/* /*

View File

@ -1013,7 +1013,7 @@ static const char *
SSLerrmessage(unsigned long ecode) SSLerrmessage(unsigned long ecode)
{ {
const char *errreason; const char *errreason;
static char errbuf[32]; static char errbuf[36];
if (ecode == 0) if (ecode == 0)
return _("no SSL error reported"); return _("no SSL error reported");

View File

@ -86,7 +86,7 @@ calculate_database_size(Oid dbOid)
DIR *dirdesc; DIR *dirdesc;
struct dirent *direntry; struct dirent *direntry;
char dirpath[MAXPGPATH]; char dirpath[MAXPGPATH];
char pathname[MAXPGPATH + 12 + sizeof(TABLESPACE_VERSION_DIRECTORY)]; char pathname[MAXPGPATH + 21 + sizeof(TABLESPACE_VERSION_DIRECTORY)];
AclResult aclresult; AclResult aclresult;
/* /*

View File

@ -44,10 +44,6 @@ static const uint32 nan[2] = {0xffffffff, 0x7fffffff};
#define NAN (*(const double *) nan) #define NAN (*(const double *) nan)
#endif #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 * check to see if a float4/8 val has underflowed or overflowed
*/ */
@ -360,18 +356,18 @@ Datum
float4out(PG_FUNCTION_ARGS) float4out(PG_FUNCTION_ARGS)
{ {
float4 num = PG_GETARG_FLOAT4(0); float4 num = PG_GETARG_FLOAT4(0);
char *ascii = (char *) palloc(MAXFLOATWIDTH + 1); char *ascii;
if (isnan(num)) if (isnan(num))
PG_RETURN_CSTRING(strcpy(ascii, "NaN")); PG_RETURN_CSTRING(pstrdup("NaN"));
switch (is_infinite(num)) switch (is_infinite(num))
{ {
case 1: case 1:
strcpy(ascii, "Infinity"); ascii = pstrdup("Infinity");
break; break;
case -1: case -1:
strcpy(ascii, "-Infinity"); ascii = pstrdup("-Infinity");
break; break;
default: default:
{ {
@ -380,7 +376,7 @@ float4out(PG_FUNCTION_ARGS)
if (ndig < 1) if (ndig < 1)
ndig = 1; ndig = 1;
snprintf(ascii, MAXFLOATWIDTH + 1, "%.*g", ndig, num); ascii = psprintf("%.*g", ndig, num);
} }
} }
@ -596,18 +592,18 @@ float8out(PG_FUNCTION_ARGS)
char * char *
float8out_internal(double num) float8out_internal(double num)
{ {
char *ascii = (char *) palloc(MAXDOUBLEWIDTH + 1); char *ascii;
if (isnan(num)) if (isnan(num))
return strcpy(ascii, "NaN"); return pstrdup("NaN");
switch (is_infinite(num)) switch (is_infinite(num))
{ {
case 1: case 1:
strcpy(ascii, "Infinity"); ascii = pstrdup("Infinity");
break; break;
case -1: case -1:
strcpy(ascii, "-Infinity"); ascii = pstrdup("-Infinity");
break; break;
default: default:
{ {
@ -616,7 +612,7 @@ float8out_internal(double num)
if (ndig < 1) if (ndig < 1)
ndig = 1; ndig = 1;
snprintf(ascii, MAXDOUBLEWIDTH + 1, "%.*g", ndig, num); ascii = psprintf("%.*g", ndig, num);
} }
} }

View File

@ -117,13 +117,6 @@
#define DCH_MAX_ITEM_SIZ 12 /* max localized day name */ #define DCH_MAX_ITEM_SIZ 12 /* max localized day name */
#define NUM_MAX_ITEM_SIZ 8 /* roman number (RN has 15 chars) */ #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 * Format parser structs
@ -3911,9 +3904,7 @@ do_to_timestamp(text *date_txt, text *fmt,
tmfc.tzm < 0 || tmfc.tzm >= MINS_PER_HOUR) tmfc.tzm < 0 || tmfc.tzm >= MINS_PER_HOUR)
DateTimeParseError(DTERR_TZDISP_OVERFLOW, date_str, "timestamp"); DateTimeParseError(DTERR_TZDISP_OVERFLOW, date_str, "timestamp");
tz = palloc(7); tz = psprintf("%c%02d:%02d",
snprintf(tz, 7, "%c%02d:%02d",
tmfc.tzsign > 0 ? '+' : '-', tmfc.tzh, tmfc.tzm); tmfc.tzsign > 0 ? '+' : '-', tmfc.tzh, tmfc.tzm);
tm->tm_zone = tz; tm->tm_zone = tz;
@ -4135,7 +4126,7 @@ int_to_roman(int number)
num = 0; num = 0;
char *p = NULL, char *p = NULL,
*result, *result,
numstr[5]; numstr[12];
result = (char *) palloc(16); result = (char *) palloc(16);
*result = '\0'; *result = '\0';
@ -5441,8 +5432,7 @@ int4_to_char(PG_FUNCTION_ARGS)
/* we can do it easily because float8 won't lose any precision */ /* we can do it easily because float8 won't lose any precision */
float8 val = (float8) value; float8 val = (float8) value;
orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1); orgnum = (char *) psprintf("%+.*e", Num.post, val);
snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%+.*e", Num.post, val);
/* /*
* Swap a leading positive sign for a space. * Swap a leading positive sign for a space.
@ -5641,7 +5631,6 @@ float4_to_char(PG_FUNCTION_ARGS)
numstr = orgnum = int_to_roman((int) rint(value)); numstr = orgnum = int_to_roman((int) rint(value));
else if (IS_EEEE(&Num)) else if (IS_EEEE(&Num))
{ {
numstr = orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
if (isnan(value) || is_infinite(value)) if (isnan(value) || is_infinite(value))
{ {
/* /*
@ -5655,7 +5644,7 @@ float4_to_char(PG_FUNCTION_ARGS)
} }
else else
{ {
snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%+.*e", Num.post, value); numstr = orgnum = psprintf("%+.*e", Num.post, value);
/* /*
* Swap a leading positive sign for a space. * Swap a leading positive sign for a space.
@ -5679,8 +5668,7 @@ float4_to_char(PG_FUNCTION_ARGS)
Num.pre += Num.multi; Num.pre += Num.multi;
} }
orgnum = (char *) palloc(MAXFLOATWIDTH + 1); orgnum = (char *) psprintf("%.0f", fabs(val));
snprintf(orgnum, MAXFLOATWIDTH + 1, "%.0f", fabs(val));
numstr_pre_len = strlen(orgnum); numstr_pre_len = strlen(orgnum);
/* adjust post digits to fit max float digits */ /* adjust post digits to fit max float digits */
@ -5688,7 +5676,7 @@ float4_to_char(PG_FUNCTION_ARGS)
Num.post = 0; Num.post = 0;
else if (numstr_pre_len + Num.post > FLT_DIG) else if (numstr_pre_len + Num.post > FLT_DIG)
Num.post = FLT_DIG - numstr_pre_len; Num.post = FLT_DIG - numstr_pre_len;
snprintf(orgnum, MAXFLOATWIDTH + 1, "%.*f", Num.post, val); orgnum = psprintf("%.*f", Num.post, val);
if (*orgnum == '-') if (*orgnum == '-')
{ /* < 0 */ { /* < 0 */
@ -5747,7 +5735,6 @@ float8_to_char(PG_FUNCTION_ARGS)
numstr = orgnum = int_to_roman((int) rint(value)); numstr = orgnum = int_to_roman((int) rint(value));
else if (IS_EEEE(&Num)) else if (IS_EEEE(&Num))
{ {
numstr = orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
if (isnan(value) || is_infinite(value)) if (isnan(value) || is_infinite(value))
{ {
/* /*
@ -5761,7 +5748,7 @@ float8_to_char(PG_FUNCTION_ARGS)
} }
else 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. * Swap a leading positive sign for a space.
@ -5784,15 +5771,15 @@ float8_to_char(PG_FUNCTION_ARGS)
val = value * multi; val = value * multi;
Num.pre += Num.multi; Num.pre += Num.multi;
} }
orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1); orgnum = psprintf("%.0f", fabs(val));
numstr_pre_len = snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.0f", fabs(val)); numstr_pre_len = strlen(orgnum);
/* adjust post digits to fit max double digits */ /* adjust post digits to fit max double digits */
if (numstr_pre_len >= DBL_DIG) if (numstr_pre_len >= DBL_DIG)
Num.post = 0; Num.post = 0;
else if (numstr_pre_len + Num.post > DBL_DIG) else if (numstr_pre_len + Num.post > DBL_DIG)
Num.post = DBL_DIG - numstr_pre_len; Num.post = DBL_DIG - numstr_pre_len;
snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.*f", Num.post, val); orgnum = psprintf("%.*f", Num.post, val);
if (*orgnum == '-') if (*orgnum == '-')
{ /* < 0 */ { /* < 0 */

View File

@ -10528,7 +10528,7 @@ check_cluster_name(char **newval, void **extra, GucSource source)
static const char * static const char *
show_unix_socket_permissions(void) show_unix_socket_permissions(void)
{ {
static char buf[8]; static char buf[12];
snprintf(buf, sizeof(buf), "%04o", Unix_socket_permissions); snprintf(buf, sizeof(buf), "%04o", Unix_socket_permissions);
return buf; return buf;
@ -10537,7 +10537,7 @@ show_unix_socket_permissions(void)
static const char * static const char *
show_log_file_mode(void) show_log_file_mode(void)
{ {
static char buf[8]; static char buf[12];
snprintf(buf, sizeof(buf), "%04o", Log_file_mode); snprintf(buf, sizeof(buf), "%04o", Log_file_mode);
return buf; return buf;

View File

@ -1009,12 +1009,12 @@ static char *
pretty_wal_size(int segment_count) pretty_wal_size(int segment_count)
{ {
int sz = wal_segment_size_mb * segment_count; int sz = wal_segment_size_mb * segment_count;
char *result = pg_malloc(11); char *result = pg_malloc(14);
if ((sz % 1024) == 0) if ((sz % 1024) == 0)
snprintf(result, 11, "%dGB", sz / 1024); snprintf(result, 14, "%dGB", sz / 1024);
else else
snprintf(result, 11, "%dMB", sz); snprintf(result, 14, "%dMB", sz);
return result; return result;
} }

View File

@ -1532,7 +1532,7 @@ SetOutput(ArchiveHandle *AH, const char *filename, int compression)
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
if (compression != 0) if (compression != 0)
{ {
char fmode[10]; char fmode[14];
/* Don't use PG_BINARY_x since this is zlib */ /* Don't use PG_BINARY_x since this is zlib */
sprintf(fmode, "wb%d", compression); sprintf(fmode, "wb%d", compression);

View File

@ -335,7 +335,7 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode)
TAR_MEMBER *tm; TAR_MEMBER *tm;
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
char fmode[10]; char fmode[14];
#endif #endif
if (mode == 'r') if (mode == 'r')

View File

@ -3591,7 +3591,7 @@ parseQuery(Command *cmd)
p = sql; p = sql;
while ((p = strchr(p, ':')) != NULL) while ((p = strchr(p, ':')) != NULL)
{ {
char var[12]; char var[13];
char *name; char *name;
int eaten; int eaten;
@ -5432,7 +5432,7 @@ threadRun(void *arg)
sqlat, sqlat,
lag, lag,
stdev; stdev;
char tbuf[64]; char tbuf[315];
/* /*
* Add up the statistics of all threads. * Add up the statistics of all threads.

View File

@ -82,7 +82,7 @@ typedef enum
#define BGW_DEFAULT_RESTART_INTERVAL 60 #define BGW_DEFAULT_RESTART_INTERVAL 60
#define BGW_NEVER_RESTART -1 #define BGW_NEVER_RESTART -1
#define BGW_MAXLEN 64 #define BGW_MAXLEN 96
#define BGW_EXTRALEN 128 #define BGW_EXTRALEN 128
typedef struct BackgroundWorker typedef struct BackgroundWorker

View File

@ -1436,7 +1436,7 @@ PQsslAttribute(PGconn *conn, const char *attribute_name)
if (strcmp(attribute_name, "key_bits") == 0) if (strcmp(attribute_name, "key_bits") == 0)
{ {
static char sslbits_str[10]; static char sslbits_str[12];
int sslbits; int sslbits;
SSL_get_cipher_bits(conn->ssl, &sslbits); SSL_get_cipher_bits(conn->ssl, &sslbits);

View File

@ -1456,7 +1456,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid,
Datum prosrcdatum; Datum prosrcdatum;
bool isnull; bool isnull;
char *proc_source; char *proc_source;
char buf[32]; char buf[48];
Tcl_Interp *interp; Tcl_Interp *interp;
int i; int i;
int tcl_rc; int tcl_rc;