Fix this warning when building with GCC9 on Fedora 30:
In function ‘strncpy’,
inlined from ‘fill_psinfo’ at /home/alistair/qemu/linux-user/elfload.c:3208:12,
inlined from ‘fill_note_info’ at /home/alistair/qemu/linux-user/elfload.c:3390:5,
inlined from ‘elf_core_dump’ at /home/alistair/qemu/linux-user/elfload.c:3539:9:
/usr/include/bits/string_fortified.h:106:10: error: ‘__builtin_strncpy’ specified bound 16 equals destination size [-Werror=stringop-truncation]
106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
---
linux-user/elfload.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index c1a26021f8..cbb7fc10fa 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -3206,7 +3206,7 @@ static int fill_psinfo(struct target_elf_prpsinfo *psinfo, const TaskState *ts)
* this field is not NUL-terminated.
*/
(void) strncpy(psinfo->pr_fname, base_filename,
- sizeof(psinfo->pr_fname));
+ sizeof(psinfo->pr_fname) - 1);
g_free(base_filename);
bswap_psinfo(psinfo);
@@ -3389,7 +3389,7 @@ static int fill_note_info(struct elf_note_info *info,
sizeof (*info->prstatus), info->prstatus);
fill_psinfo(info->psinfo, ts);
fill_note(&info->notes[1], "CORE", NT_PRPSINFO,
- sizeof (*info->psinfo), info->psinfo);
+ sizeof(*info->psinfo) - 1, info->psinfo);
fill_auxv_note(&info->notes[2], ts);
info->numnote = 3;
--
2.21.0
Le 30/04/2019 à 22:09, Alistair Francis a écrit :
> Fix this warning when building with GCC9 on Fedora 30:
> In function ‘strncpy’,
> inlined from ‘fill_psinfo’ at /home/alistair/qemu/linux-user/elfload.c:3208:12,
> inlined from ‘fill_note_info’ at /home/alistair/qemu/linux-user/elfload.c:3390:5,
> inlined from ‘elf_core_dump’ at /home/alistair/qemu/linux-user/elfload.c:3539:9:
> /usr/include/bits/string_fortified.h:106:10: error: ‘__builtin_strncpy’ specified bound 16 equals destination size [-Werror=stringop-truncation]
> 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest));
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
> ---
> linux-user/elfload.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/linux-user/elfload.c b/linux-user/elfload.c
> index c1a26021f8..cbb7fc10fa 100644
> --- a/linux-user/elfload.c
> +++ b/linux-user/elfload.c
> @@ -3206,7 +3206,7 @@ static int fill_psinfo(struct target_elf_prpsinfo *psinfo, const TaskState *ts)
/*
* Using strncpy here is fine: at max-length,
> * this field is not NUL-terminated.
> */> (void) strncpy(psinfo->pr_fname, base_filename,
> - sizeof(psinfo->pr_fname));
> + sizeof(psinfo->pr_fname) - 1);
Read the comment above :)
>
> g_free(base_filename);
> bswap_psinfo(psinfo);
> @@ -3389,7 +3389,7 @@ static int fill_note_info(struct elf_note_info *info,
> sizeof (*info->prstatus), info->prstatus);
> fill_psinfo(info->psinfo, ts);
> fill_note(&info->notes[1], "CORE", NT_PRPSINFO,
> - sizeof (*info->psinfo), info->psinfo);
> + sizeof(*info->psinfo) - 1, info->psinfo);
Why?
> fill_auxv_note(&info->notes[2], ts);
> info->numnote = 3;
>
>
Thanks,
Laurent
On Tue, Apr 30, 2019 at 1:36 PM Laurent Vivier <laurent@vivier.eu> wrote: > > Le 30/04/2019 à 22:09, Alistair Francis a écrit : > > Fix this warning when building with GCC9 on Fedora 30: > > In function ‘strncpy’, > > inlined from ‘fill_psinfo’ at /home/alistair/qemu/linux-user/elfload.c:3208:12, > > inlined from ‘fill_note_info’ at /home/alistair/qemu/linux-user/elfload.c:3390:5, > > inlined from ‘elf_core_dump’ at /home/alistair/qemu/linux-user/elfload.c:3539:9: > > /usr/include/bits/string_fortified.h:106:10: error: ‘__builtin_strncpy’ specified bound 16 equals destination size [-Werror=stringop-truncation] > > 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); > > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > > > Signed-off-by: Alistair Francis <alistair.francis@wdc.com> > > --- > > linux-user/elfload.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/linux-user/elfload.c b/linux-user/elfload.c > > index c1a26021f8..cbb7fc10fa 100644 > > --- a/linux-user/elfload.c > > +++ b/linux-user/elfload.c > > @@ -3206,7 +3206,7 @@ static int fill_psinfo(struct target_elf_prpsinfo *psinfo, const TaskState *ts) > > /* > * Using strncpy here is fine: at max-length, > > * this field is not NUL-terminated. > > */> (void) strncpy(psinfo->pr_fname, base_filename, > > - sizeof(psinfo->pr_fname)); > > + sizeof(psinfo->pr_fname) - 1); > > Read the comment above :) GCC can't read the comment though. The only other option I can think of is using a pragma, which I avoided using unless I had to. Would you prefer a pragma here? Or do you have a better solution? > > > > > g_free(base_filename); > > bswap_psinfo(psinfo); > > @@ -3389,7 +3389,7 @@ static int fill_note_info(struct elf_note_info *info, > > sizeof (*info->prstatus), info->prstatus); > > fill_psinfo(info->psinfo, ts); > > fill_note(&info->notes[1], "CORE", NT_PRPSINFO, > > - sizeof (*info->psinfo), info->psinfo); > > + sizeof(*info->psinfo) - 1, info->psinfo); > > Why? Same issue as above. Alistair > > > fill_auxv_note(&info->notes[2], ts); > > info->numnote = 3; > > > > > > Thanks, > Laurent
Le 30/04/2019 à 23:01, Alistair Francis a écrit : > On Tue, Apr 30, 2019 at 1:36 PM Laurent Vivier <laurent@vivier.eu> wrote: >> >> Le 30/04/2019 à 22:09, Alistair Francis a écrit : >>> Fix this warning when building with GCC9 on Fedora 30: >>> In function ‘strncpy’, >>> inlined from ‘fill_psinfo’ at /home/alistair/qemu/linux-user/elfload.c:3208:12, >>> inlined from ‘fill_note_info’ at /home/alistair/qemu/linux-user/elfload.c:3390:5, >>> inlined from ‘elf_core_dump’ at /home/alistair/qemu/linux-user/elfload.c:3539:9: >>> /usr/include/bits/string_fortified.h:106:10: error: ‘__builtin_strncpy’ specified bound 16 equals destination size [-Werror=stringop-truncation] >>> 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); >>> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>> >>> Signed-off-by: Alistair Francis <alistair.francis@wdc.com> >>> --- >>> linux-user/elfload.c | 4 ++-- >>> 1 file changed, 2 insertions(+), 2 deletions(-) >>> >>> diff --git a/linux-user/elfload.c b/linux-user/elfload.c >>> index c1a26021f8..cbb7fc10fa 100644 >>> --- a/linux-user/elfload.c >>> +++ b/linux-user/elfload.c >>> @@ -3206,7 +3206,7 @@ static int fill_psinfo(struct target_elf_prpsinfo *psinfo, const TaskState *ts) >> >> /* >> * Using strncpy here is fine: at max-length, >>> * this field is not NUL-terminated. >>> */> (void) strncpy(psinfo->pr_fname, base_filename, >>> - sizeof(psinfo->pr_fname)); >>> + sizeof(psinfo->pr_fname) - 1); >> >> Read the comment above :) > > GCC can't read the comment though. The only other option I can think > of is using a pragma, which I avoided using unless I had to. Would you > prefer a pragma here? Or do you have a better solution? > perhaps: memcpy(psinfo->pr_fname, base_filename, MIN(strlen(base_filename) + 1, sizeof(psinfo->pr_fname)); ? Thanks, Laurent
On 4/30/19 4:01 PM, Alistair Francis wrote:
> On Tue, Apr 30, 2019 at 1:36 PM Laurent Vivier <laurent@vivier.eu> wrote:
>>
>> Le 30/04/2019 à 22:09, Alistair Francis a écrit :
>>> Fix this warning when building with GCC9 on Fedora 30:
>>> In function ‘strncpy’,
>>> inlined from ‘fill_psinfo’ at /home/alistair/qemu/linux-user/elfload.c:3208:12,
>>> inlined from ‘fill_note_info’ at /home/alistair/qemu/linux-user/elfload.c:3390:5,
>>> inlined from ‘elf_core_dump’ at /home/alistair/qemu/linux-user/elfload.c:3539:9:
>>> /usr/include/bits/string_fortified.h:106:10: error: ‘__builtin_strncpy’ specified bound 16 equals destination size [-Werror=stringop-truncation]
>>> 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest));
>>> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>
>> /*
>> * Using strncpy here is fine: at max-length,
>>> * this field is not NUL-terminated.
>>> */> (void) strncpy(psinfo->pr_fname, base_filename,
>>> - sizeof(psinfo->pr_fname));
>>> + sizeof(psinfo->pr_fname) - 1);
>>
>> Read the comment above :)
>
> GCC can't read the comment though. The only other option I can think
> of is using a pragma, which I avoided using unless I had to. Would you
> prefer a pragma here? Or do you have a better solution?
psinfo is struct target_elf_prpsinfo, which we declare. Why not just
use the QEMU_NONSTRING attribute in the declaration, to tell the
compiler our exact intents (untested, but something like this):
diff --git i/linux-user/elfload.c w/linux-user/elfload.c
index c1a26021f8d..6ebb2eeb957 100644
--- i/linux-user/elfload.c
+++ w/linux-user/elfload.c
@@ -2872,7 +2872,7 @@ struct target_elf_prpsinfo {
target_gid_t pr_gid;
target_pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid;
/* Lots missing */
- char pr_fname[16]; /* filename of executable */
+ char pr_fname[16] QEMU_NONSTRING; /* filename of
executable */
char pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
};
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
On Tue, Apr 30, 2019 at 2:10 PM Eric Blake <eblake@redhat.com> wrote:
>
> On 4/30/19 4:01 PM, Alistair Francis wrote:
> > On Tue, Apr 30, 2019 at 1:36 PM Laurent Vivier <laurent@vivier.eu> wrote:
> >>
> >> Le 30/04/2019 à 22:09, Alistair Francis a écrit :
> >>> Fix this warning when building with GCC9 on Fedora 30:
> >>> In function ‘strncpy’,
> >>> inlined from ‘fill_psinfo’ at /home/alistair/qemu/linux-user/elfload.c:3208:12,
> >>> inlined from ‘fill_note_info’ at /home/alistair/qemu/linux-user/elfload.c:3390:5,
> >>> inlined from ‘elf_core_dump’ at /home/alistair/qemu/linux-user/elfload.c:3539:9:
> >>> /usr/include/bits/string_fortified.h:106:10: error: ‘__builtin_strncpy’ specified bound 16 equals destination size [-Werror=stringop-truncation]
> >>> 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest));
> >>> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >>>
>
> >> /*
> >> * Using strncpy here is fine: at max-length,
> >>> * this field is not NUL-terminated.
> >>> */> (void) strncpy(psinfo->pr_fname, base_filename,
> >>> - sizeof(psinfo->pr_fname));
> >>> + sizeof(psinfo->pr_fname) - 1);
> >>
> >> Read the comment above :)
> >
> > GCC can't read the comment though. The only other option I can think
> > of is using a pragma, which I avoided using unless I had to. Would you
> > prefer a pragma here? Or do you have a better solution?
>
> psinfo is struct target_elf_prpsinfo, which we declare. Why not just
> use the QEMU_NONSTRING attribute in the declaration, to tell the
> compiler our exact intents (untested, but something like this):
>
> diff --git i/linux-user/elfload.c w/linux-user/elfload.c
> index c1a26021f8d..6ebb2eeb957 100644
> --- i/linux-user/elfload.c
> +++ w/linux-user/elfload.c
> @@ -2872,7 +2872,7 @@ struct target_elf_prpsinfo {
> target_gid_t pr_gid;
> target_pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid;
> /* Lots missing */
> - char pr_fname[16]; /* filename of executable */
> + char pr_fname[16] QEMU_NONSTRING; /* filename of
> executable */
> char pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
> };
I didn't know about that property, that fixes it.
Alistair
>
>
>
>
> --
> Eric Blake, Principal Software Engineer
> Red Hat, Inc. +1-919-301-3226
> Virtualization: qemu.org | libvirt.org
>
© 2016 - 2025 Red Hat, Inc.