[Bug tree-optimization/97180] warning: ‘__builtin___strncat_chk’ on strncat when it is not necessary
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Sep 23 16:13:39 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97180
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2020-09-23
CC| |msebor at gcc dot gnu.org
Keywords| |diagnostic,
| |missed-optimization
Ever confirmed|0 |1
Component|c |tree-optimization
Status|UNCONFIRMED |NEW
Blocks| |83819
--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
Below is a test case and GCC output for it (in your reports please be sure to
provide full test cases as requested in https://gcc.gnu.org/bugs/#need).
In this instance, the warning code knows the destination is the empty string,
but it doesn't know the length of the source. It uses its size to compute the
upper bound on its length. Since strncat(s1, s2, n) appends at most n nonzero
bytes from s2 to s1 followed by a nul, when n is set to sizeof (s2) - 1 the
functions copies the whole string and then adds the nul, with no truncation.
So I agree that this is a bug in the warning. Thanks for reporting it!
Independent of the warning, the strncat() call in this case (empty destination
same size as source, bound == size - 1) can also be optimized to strcpy().
That would also avoid the warning.
$ cat pr97180.c && gcc -O2 -S -Wall pr97180.c
#define size 50
char char_table[size];
char char_table2[size];
void f (void)
{
__builtin_strcpy (char_table, "");
__builtin_strncat (char_table, char_table2, size - 1);
}
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83819
[Bug 83819] [meta-bug] missing strlen optimizations
More information about the Gcc-bugs
mailing list