Commit 1c2fc017 by Jakub Jelinek Committed by Jakub Jelinek

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
parent eaf19122
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;
......
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.
/* 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" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment