mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-13 17:20:57 +08:00
builtins.c (expand_builtin, [...]): Handle BUILT_IN_STRNCAT_CHK.
* builtins.c (expand_builtin, maybe_emit_chk_warning): Handle BUILT_IN_STRNCAT_CHK. * gcc.dg/builtin-strncat-chk-1.c: New test. From-SVN: r117980
This commit is contained in:
parent
eaf1912236
commit
1c2fc017ed
@ -1,3 +1,8 @@
|
||||
2006-10-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* builtins.c (expand_builtin, maybe_emit_chk_warning): Handle
|
||||
BUILT_IN_STRNCAT_CHK.
|
||||
|
||||
2006-10-23 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* builtins.c (expand_builtin_memmove): Remove ORIG_EXP argument;
|
||||
|
@ -6494,6 +6494,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
|
||||
case BUILT_IN_STPCPY_CHK:
|
||||
case BUILT_IN_STRNCPY_CHK:
|
||||
case BUILT_IN_STRCAT_CHK:
|
||||
case BUILT_IN_STRNCAT_CHK:
|
||||
case BUILT_IN_SNPRINTF_CHK:
|
||||
case BUILT_IN_VSNPRINTF_CHK:
|
||||
maybe_emit_chk_warning (exp, fcode);
|
||||
@ -10243,6 +10244,11 @@ maybe_emit_chk_warning (tree exp, enum built_in_function fcode)
|
||||
arg_mask = 6;
|
||||
is_strlen = 1;
|
||||
break;
|
||||
case BUILT_IN_STRNCAT_CHK:
|
||||
/* For __strncat_chk the warning will be emitted only if overflowing
|
||||
by at least strlen (dest) + 1 bytes. */
|
||||
arg_mask = 12;
|
||||
break;
|
||||
case BUILT_IN_STRNCPY_CHK:
|
||||
arg_mask = 12;
|
||||
break;
|
||||
@ -10280,6 +10286,22 @@ maybe_emit_chk_warning (tree exp, enum built_in_function fcode)
|
||||
if (! len || ! host_integerp (len, 1) || tree_int_cst_lt (len, size))
|
||||
return;
|
||||
}
|
||||
else if (fcode == BUILT_IN_STRNCAT_CHK)
|
||||
{
|
||||
tree src = TREE_VALUE (TREE_CHAIN (arglist));
|
||||
if (! src || ! host_integerp (len, 1) || tree_int_cst_lt (len, size))
|
||||
return;
|
||||
src = c_strlen (src, 1);
|
||||
if (! src || ! host_integerp (src, 1))
|
||||
{
|
||||
locus = EXPR_LOCATION (exp);
|
||||
warning (0, "%Hcall to %D might overflow destination buffer",
|
||||
&locus, get_callee_fndecl (exp));
|
||||
return;
|
||||
}
|
||||
else if (tree_int_cst_lt (src, size))
|
||||
return;
|
||||
}
|
||||
else if (! host_integerp (len, 1) || ! tree_int_cst_lt (size, len))
|
||||
return;
|
||||
|
||||
|
@ -1,3 +1,7 @@
|
||||
2006-10-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gcc.dg/builtin-strncat-chk-1.c: New test.
|
||||
|
||||
2006-10-23 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* gcc.dg/memmove-1.c: New test.
|
||||
|
38
gcc/testsuite/gcc.dg/builtin-strncat-chk-1.c
Normal file
38
gcc/testsuite/gcc.dg/builtin-strncat-chk-1.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Test whether buffer overflow warnings for __strncat_chk builtin
|
||||
are emitted properly. */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -std=gnu99" } */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
#include "../gcc.c-torture/execute/builtins/chk.h"
|
||||
|
||||
char buf1[20];
|
||||
char *q;
|
||||
|
||||
void
|
||||
test (int arg, ...)
|
||||
{
|
||||
char *p = &buf1[10];
|
||||
|
||||
*p = 0;
|
||||
strncat (p, "abcdefg", 9);
|
||||
*p = 0;
|
||||
strncat (p, "abcdefghi", 9);
|
||||
*p = 0;
|
||||
strncat (p, "abcdefghij", 9);
|
||||
*p = 0;
|
||||
strncat (p, "abcdefghi", 10);
|
||||
*p = 0;
|
||||
strncat (p, "abcdefghij", 10); /* { dg-warning "will always overflow" } */
|
||||
*p = 0;
|
||||
strncat (p, "abcdefgh", 11);
|
||||
*p = 0;
|
||||
strncat (p, "abcdefghijkl", 11); /* { dg-warning "will always overflow" } */
|
||||
*p = 0;
|
||||
strncat (p, q, 9);
|
||||
*p = 0;
|
||||
strncat (p, q, 10); /* { dg-warning "might overflow" } */
|
||||
*p = 0;
|
||||
strncat (p, q, 11); /* { dg-warning "might overflow" } */
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user