https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84649
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution|--- |INVALID
--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
Unlike for strncpy where the main goal of the warning is to help detect calls
that unintentionally leave the copy unterminated, for strncat (which always
appends a nul) the main goal is to help detect the possibility of a buffer
overflow. A secondary goal is to detect unintended truncation of the source
string.
With that in mind the recommended use of the function is like so:
char *append_leading_digits(char *cp, unsigned size, int i)
{
char buf[16];
__builtin_sprintf(buf, "%2i ", i);
__builtin_strncat(cp, buf, size - __builtin_strlen (cp) - 1);
return cp;
}
If you don't have access to the size of the buffer an alternative is to use
memcpy (it also doesn't prevent buffer overflow like the original but it
doesn't trigger a warning):
char *append_leading_digits(char *cp, int i)
{
char buf[16];
int n = __builtin_sprintf(buf, "%2i ", i);
__builtin_memcpy(cp, buf, n < 4 ? n : 4);
return cp;
}
or, assuming there's at least 5 bytes worth of space in cp, simply:
char *append_leading_digits(char *cp, int i)
{
__builtin_snprintf(cp, 5, "%2i ", i);
return cp;
}
(This last one will trigger a -Wformat-truncation warning at level 2 due to the
possible truncation.)
For more background on the philosophy behind the warning please see for
example:
https://www.us-cert.gov/bsi/articles/knowledge/coding-practices/strncpy-and-strncat
Since the warning is behaving as intended I'm going to resolve this report as
invalid.