[PATCH] net/dump.c: Suppress spurious compiler warning

Philipp Tomsich posted 1 patch 2 years, 3 months ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20220109205748.4127032-1-philipp.tomsich@vrull.eu
net/dump.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH] net/dump.c: Suppress spurious compiler warning
Posted by Philipp Tomsich 2 years, 3 months ago
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;
-- 
2.33.1


Re: [PATCH] net/dump.c: Suppress spurious compiler warning
Posted by Philippe Mathieu-Daudé 2 years, 3 months ago
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;

Re: [PATCH] net/dump.c: Suppress spurious compiler warning
Posted by Philipp Tomsich 2 years, 3 months ago
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;
>
Re: [PATCH] net/dump.c: Suppress spurious compiler warning
Posted by Eric Blake 2 years, 3 months ago
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>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org