Message ID | 20220109205748.4127032-1-philipp.tomsich@vrull.eu (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | net/dump.c: Suppress spurious compiler warning | expand |
Cc'ing Richard & Eric for dubious compiler warning. On 1/9/22 21:57, Philipp Tomsich wrote: > Compiling with gcc version 11.2.0 (Ubuntu 11.2.0-13ubuntu1) results in > a (spurious) warning: > > In function ‘dump_receive_iov’, > inlined from ‘filter_dump_receive_iov’ at ../net/dump.c:157:5: > ../net/dump.c:89:9: error: ‘writev’ specified size 18446744073709551600 exceeds maximum object size 9223372036854775807 [-Werror=stringop-overflow=] > 89 | if (writev(s->fd, dumpiov, cnt + 1) != sizeof(hdr) + caplen) { > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > In file included from /home/ptomsich/qemu/include/qemu/osdep.h:108, > from ../net/dump.c:25: > ../net/dump.c: In function ‘filter_dump_receive_iov’: > /usr/include/x86_64-linux-gnu/sys/uio.h:52:16: note: in a call to function ‘writev’ declared with attribute ‘read_only (2, 3)’ > 52 | extern ssize_t writev (int __fd, const struct iovec *__iovec, int __count) > | ^~~~~~ > cc1: all warnings being treated as errors > > This change helps that version of GCC to understand what is going on > and suppresses this warning. > > Signed-off-by: Philipp Tomsich <philipp.tomsich@vrull.eu> > > --- > > net/dump.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/net/dump.c b/net/dump.c > index a07ba62401..c32d3bf4e6 100644 > --- a/net/dump.c > +++ b/net/dump.c > @@ -86,7 +86,7 @@ static ssize_t dump_receive_iov(DumpState *s, const struct iovec *iov, int cnt) > dumpiov[0].iov_len = sizeof(hdr); > cnt = iov_copy(&dumpiov[1], cnt, iov, cnt, 0, caplen); > > - if (writev(s->fd, dumpiov, cnt + 1) != sizeof(hdr) + caplen) { > + if (writev(s->fd, &dumpiov[0], cnt + 1) != sizeof(hdr) + caplen) { > error_report("network dump write error - stopping dump"); > close(s->fd); > s->fd = -1;
Note that I don't expect this to get applied. I just put it onto the list for visibility and to make the workaround available for downstream users that might run into the issue while Ubuntu 22.04 is maturing. I won't have any time to dig into this on the GCC side until GCC12 is out. Philipp. On Mon, 10 Jan 2022 at 10:39, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote: > Cc'ing Richard & Eric for dubious compiler warning. > > On 1/9/22 21:57, Philipp Tomsich wrote: > > Compiling with gcc version 11.2.0 (Ubuntu 11.2.0-13ubuntu1) results in > > a (spurious) warning: > > > > In function ‘dump_receive_iov’, > > inlined from ‘filter_dump_receive_iov’ at ../net/dump.c:157:5: > > ../net/dump.c:89:9: error: ‘writev’ specified size > 18446744073709551600 exceeds maximum object size 9223372036854775807 > [-Werror=stringop-overflow=] > > 89 | if (writev(s->fd, dumpiov, cnt + 1) != sizeof(hdr) + > caplen) { > > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > In file included from /home/ptomsich/qemu/include/qemu/osdep.h:108, > > from ../net/dump.c:25: > > ../net/dump.c: In function ‘filter_dump_receive_iov’: > > /usr/include/x86_64-linux-gnu/sys/uio.h:52:16: note: in a call to > function ‘writev’ declared with attribute ‘read_only (2, 3)’ > > 52 | extern ssize_t writev (int __fd, const struct iovec *__iovec, > int __count) > > | ^~~~~~ > > cc1: all warnings being treated as errors > > > > This change helps that version of GCC to understand what is going on > > and suppresses this warning. > > > > Signed-off-by: Philipp Tomsich <philipp.tomsich@vrull.eu> > > > > --- > > > > net/dump.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/net/dump.c b/net/dump.c > > index a07ba62401..c32d3bf4e6 100644 > > --- a/net/dump.c > > +++ b/net/dump.c > > @@ -86,7 +86,7 @@ static ssize_t dump_receive_iov(DumpState *s, const > struct iovec *iov, int cnt) > > dumpiov[0].iov_len = sizeof(hdr); > > cnt = iov_copy(&dumpiov[1], cnt, iov, cnt, 0, caplen); > > > > - if (writev(s->fd, dumpiov, cnt + 1) != sizeof(hdr) + caplen) { > > + if (writev(s->fd, &dumpiov[0], cnt + 1) != sizeof(hdr) + caplen) { > > error_report("network dump write error - stopping dump"); > > close(s->fd); > > s->fd = -1; >
On Mon, Jan 10, 2022 at 10:38:59AM +0100, Philippe Mathieu-Daudé wrote: > Cc'ing Richard & Eric for dubious compiler warning. > > On 1/9/22 21:57, Philipp Tomsich wrote: > > Compiling with gcc version 11.2.0 (Ubuntu 11.2.0-13ubuntu1) results in > > a (spurious) warning: > > > > In function ‘dump_receive_iov’, > > inlined from ‘filter_dump_receive_iov’ at ../net/dump.c:157:5: > > ../net/dump.c:89:9: error: ‘writev’ specified size 18446744073709551600 exceeds maximum object size 9223372036854775807 [-Werror=stringop-overflow=] > > 89 | if (writev(s->fd, dumpiov, cnt + 1) != sizeof(hdr) + caplen) { > > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > In file included from /home/ptomsich/qemu/include/qemu/osdep.h:108, > > from ../net/dump.c:25: > > ../net/dump.c: In function ‘filter_dump_receive_iov’: > > /usr/include/x86_64-linux-gnu/sys/uio.h:52:16: note: in a call to function ‘writev’ declared with attribute ‘read_only (2, 3)’ > > 52 | extern ssize_t writev (int __fd, const struct iovec *__iovec, int __count) > > | ^~~~~~ > > cc1: all warnings being treated as errors That is an odd error message. > > > > This change helps that version of GCC to understand what is going on > > and suppresses this warning. > > > > Signed-off-by: Philipp Tomsich <philipp.tomsich@vrull.eu> > > > > --- > > > > net/dump.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/net/dump.c b/net/dump.c > > index a07ba62401..c32d3bf4e6 100644 > > --- a/net/dump.c > > +++ b/net/dump.c > > @@ -86,7 +86,7 @@ static ssize_t dump_receive_iov(DumpState *s, const struct iovec *iov, int cnt) > > dumpiov[0].iov_len = sizeof(hdr); > > cnt = iov_copy(&dumpiov[1], cnt, iov, cnt, 0, caplen); > > > > - if (writev(s->fd, dumpiov, cnt + 1) != sizeof(hdr) + caplen) { > > + if (writev(s->fd, &dumpiov[0], cnt + 1) != sizeof(hdr) + caplen) { This change is safe; it results in the same pointer. Obviously, the latter spelling is able to provide the compiler with a bit more type information about the pointer, so that it no longer assumes a pointer to an unbounded array, so if it silences the warning, I see no downside in including it whether or not gcc is also patched to avoid creating a spurious warning in the first place. Reviewed-by: Eric Blake <eblake@redhat.com>
diff --git a/net/dump.c b/net/dump.c index a07ba62401..c32d3bf4e6 100644 --- a/net/dump.c +++ b/net/dump.c @@ -86,7 +86,7 @@ static ssize_t dump_receive_iov(DumpState *s, const struct iovec *iov, int cnt) dumpiov[0].iov_len = sizeof(hdr); cnt = iov_copy(&dumpiov[1], cnt, iov, cnt, 0, caplen); - if (writev(s->fd, dumpiov, cnt + 1) != sizeof(hdr) + caplen) { + if (writev(s->fd, &dumpiov[0], cnt + 1) != sizeof(hdr) + caplen) { error_report("network dump write error - stopping dump"); close(s->fd); s->fd = -1;
Compiling with gcc version 11.2.0 (Ubuntu 11.2.0-13ubuntu1) results in a (spurious) warning: In function ‘dump_receive_iov’, inlined from ‘filter_dump_receive_iov’ at ../net/dump.c:157:5: ../net/dump.c:89:9: error: ‘writev’ specified size 18446744073709551600 exceeds maximum object size 9223372036854775807 [-Werror=stringop-overflow=] 89 | if (writev(s->fd, dumpiov, cnt + 1) != sizeof(hdr) + caplen) { | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from /home/ptomsich/qemu/include/qemu/osdep.h:108, from ../net/dump.c:25: ../net/dump.c: In function ‘filter_dump_receive_iov’: /usr/include/x86_64-linux-gnu/sys/uio.h:52:16: note: in a call to function ‘writev’ declared with attribute ‘read_only (2, 3)’ 52 | extern ssize_t writev (int __fd, const struct iovec *__iovec, int __count) | ^~~~~~ cc1: all warnings being treated as errors This change helps that version of GCC to understand what is going on and suppresses this warning. Signed-off-by: Philipp Tomsich <philipp.tomsich@vrull.eu> --- net/dump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)