Skip to contentSkip to conversation

xfs_io: fix gcc-7 related printf warnings

PATCH In review Dave Chinner 3 participants 4 messages Nov 10, 2017

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 xfs_io: fix gcc-7 related printf warnings

From: Dave Chinner <[email protected]>

New compiler, new checks, new warnings.

Fix the new [-Wformat-truncation=] warnings that io/fsmap.c is throwing w/ gcc-7.2 because "%lld..%lld" requires a buffer 40 characters long, not 32.

---
 io/fsmap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
io/fsmap.c +2 -2
index 448fb5356466..e46fdbaa148c 100644
@@ -184,8 +184,8 @@ dump_map_verbose(
 	off64_t			agoff, bperag;
 	int			foff_w, boff_w, aoff_w, tot_w, agno_w, own_w;
 	int			nr_w, dev_w;
-	char			rbuf[32], bbuf[32], abuf[32], obuf[32];
-	char			nbuf[32], dbuf[32], gbuf[32];
+	char			rbuf[40], bbuf[40], abuf[40], obuf[40];
+	char			nbuf[40], dbuf[40], gbuf[40];
 	char			owner[OWNER_BUF_SZ];
 	int			sunit, swidth;
 	int			flg = 0;
Signature · 1 line
2.15.0
Reviewed-by on v1 1/1
#1 lore raw
Quoted 9 lines · Dave Chinner

From: Dave Chinner <[email protected]>

New compiler, new checks, new warnings.

Fix the new [-Wformat-truncation=] warnings that io/fsmap.c is throwing w/ gcc-7.2 because "%lld..%lld" requires a buffer 40 characters long, not 32.

2^63 is 19 chars, yup.

Quoted 20 lines
---
 io/fsmap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
io/fsmap.c +2 -2
index 448fb5356466..e46fdbaa148c 100644
@@ -184,8 +184,8 @@ dump_map_verbose(
 	off64_t			agoff, bperag;
 	int			foff_w, boff_w, aoff_w, tot_w, agno_w, own_w;
 	int			nr_w, dev_w;
-	char			rbuf[32], bbuf[32], abuf[32], obuf[32];
-	char			nbuf[32], dbuf[32], gbuf[32];
+	char			rbuf[40], bbuf[40], abuf[40], obuf[40];
+	char			nbuf[40], dbuf[40], gbuf[40];
 	char			owner[OWNER_BUF_SZ];
 	int			sunit, swidth;
 	int			flg = 0;
#2 lore raw
Quoted 19 lines · Eric Sandeen
Quoted 9 lines · Dave Chinner

From: Dave Chinner <[email protected]>

New compiler, new checks, new warnings.

Fix the new [-Wformat-truncation=] warnings that io/fsmap.c is throwing w/ gcc-7.2 because "%lld..%lld" requires a buffer 40 characters long, not 32.

2^63 is 19 chars, yup.

Quoted 4 lines
---
 io/fsmap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Quoted 12 lines

io/fsmap.c dump_map_verbose( · line 188

Quoted 12 lines
io/fsmap.c +2 -2
index 448fb5356466..e46fdbaa148c 100644
@@ -184,8 +184,8 @@ dump_map_verbose(
 	off64_t			agoff, bperag;
 	int			foff_w, boff_w, aoff_w, tot_w, agno_w, own_w;
 	int			nr_w, dev_w;
-	char			rbuf[32], bbuf[32], abuf[32], obuf[32];
-	char			nbuf[32], dbuf[32], gbuf[32];
+	char			rbuf[40], bbuf[40], abuf[40], obuf[40];
+	char			nbuf[40], dbuf[40], gbuf[40];

Waitaminute. The longest format string is bbuf, which gets "[%lld..%lld]:". The longest number %lld can print is "-9223372036854775807" which requires 20 bytes. Therefore, bbuf needs 1 + 20 + 2 + 20 + 2 + 1 == 46 bytes, not 40. rbuf and abuf have similar problems, though I guess a 48-byte string will work for all.

Granted, it's snprintf so it'll just truncate the second number if it has to, but seeing as this came from a gcc warning:

"fsmap.c:228:3: note: ‘snprintf’ output between 8 and 40 bytes into a destination of size 32"

So am I just bad at math, or is gcc wrong here?

--D

Quoted 8 lines

io/fsmap.c dump_map_verbose( · line 191

Quoted 4 lines
io/fsmap.c +0 -0
 	char			owner[OWNER_BUF_SZ];
 	int			sunit, swidth;
 	int			flg = 0;

--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

Reviewed-by
#3 lore raw
Quoted 39 lines · Darrick J. Wong
Quoted 19 lines · Eric Sandeen
Quoted 9 lines · Dave Chinner

From: Dave Chinner <[email protected]>

New compiler, new checks, new warnings.

Fix the new [-Wformat-truncation=] warnings that io/fsmap.c is throwing w/ gcc-7.2 because "%lld..%lld" requires a buffer 40 characters long, not 32.

2^63 is 19 chars, yup.

Quoted 4 lines
---
 io/fsmap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Quoted 12 lines

io/fsmap.c dump_map_verbose( · line 188

Quoted 12 lines
io/fsmap.c +2 -2
index 448fb5356466..e46fdbaa148c 100644
@@ -184,8 +184,8 @@ dump_map_verbose(
 	off64_t			agoff, bperag;
 	int			foff_w, boff_w, aoff_w, tot_w, agno_w, own_w;
 	int			nr_w, dev_w;
-	char			rbuf[32], bbuf[32], abuf[32], obuf[32];
-	char			nbuf[32], dbuf[32], gbuf[32];
+	char			rbuf[40], bbuf[40], abuf[40], obuf[40];
+	char			nbuf[40], dbuf[40], gbuf[40];

Waitaminute. The longest format string is bbuf, which gets "[%lld..%lld]:". The longest number %lld can print is "-9223372036854775807" which requires 20 bytes. Therefore, bbuf needs 1 + 20 + 2 + 20 + 2 + 1 == 46 bytes, not 40. rbuf and abuf have similar problems, though I guess a 48-byte string will work for all.

Quoted 7 lines

Granted, it's snprintf so it'll just truncate the second number if it has to, but seeing as this came from a gcc warning:

"fsmap.c:228:3: note: ‘snprintf’ output between 8 and 40 bytes into a destination of size 32"

So am I just bad at math, or is gcc wrong here?

Ah, dchinner points out on irc that gcc knows we (>> 9) the numbers before printing them so the maximum value is 36028797018963967, so 40 bytes works.

gcc: 1, maintainer: 0

Looks ok,

--D

Quoted 14 lines

--D

Quoted 8 lines

io/fsmap.c dump_map_verbose( · line 191

Quoted 4 lines
io/fsmap.c +0 -0
 	char			owner[OWNER_BUF_SZ];
 	int			sunit, swidth;
 	int			flg = 0;

--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html