diff options
author | Alan Modra <amodra@gmail.com> | 2025-04-21 09:03:52 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2025-04-21 09:03:52 +0930 |
commit | 9c7ed7b7fdbe4e25b4bad5e64f5d37936e4c9045 (patch) | |
tree | ff8332ddd5274355c7879d3fe5cd49a88b4cb55b | |
parent | 7dc5df8e5d374fa6fec2f2a6b7d1bbc258095d47 (diff) | |
download | binutils-9c7ed7b7fdbe4e25b4bad5e64f5d37936e4c9045.zip binutils-9c7ed7b7fdbe4e25b4bad5e64f5d37936e4c9045.tar.gz binutils-9c7ed7b7fdbe4e25b4bad5e64f5d37936e4c9045.tar.bz2 |
avoid bogus format-overflow error
Seen on x86_64-linux Ubuntu 24.04.2 using gcc-13.3.0 with
CFLAGS="-m32 -g -O2 -fsanitize=address,undefined"
In function ‘sprintf’,
inlined from ‘s_mri_for’ at gas/config/tc-m68k.c:6941:5:
/usr/include/bits/stdio2.h:30:10: error: null destination pointer [-Werror=format-overflow=]
30 | return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
31 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
Rewrite the code without sprintf, as in other parts of s_mri_for.
See also commit 760fb390fd4c and following commits.
Note that adding -D_FORTIFY_SOURCE=0 to CFLAGS (which is a good idea
when building with sanitizers) merely transforms the sprintf_chk error
here into one regarding plain sprintf.
-rw-r--r-- | gas/config/tc-m68k.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/gas/config/tc-m68k.c b/gas/config/tc-m68k.c index 0f36741..46b26d4 100644 --- a/gas/config/tc-m68k.c +++ b/gas/config/tc-m68k.c @@ -6754,7 +6754,6 @@ s_mri_for (int qual) struct mri_control_info *n; char *buf; char *s; - char ex[2]; /* The syntax is FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e @@ -6935,12 +6934,14 @@ s_mri_for (int qual) mri_assemble (buf); /* bcc bottom. */ - ex[0] = TOLOWER (extent); - ex[1] = '\0'; - if (up) - sprintf (buf, "blt%s %s", ex, n->bottom); - else - sprintf (buf, "bgt%s %s", ex, n->bottom); + s = buf; + *s++ = 'b'; + *s++ = up ? 'l' : 'g'; + *s++ = 't'; + if (extent != '\0') + *s++ = TOLOWER (extent); + *s++ = ' '; + strcpy (s, n->bottom); mri_assemble (buf); /* Put together the add or sub instruction used by ENDF. */ |