backport: re PR c/83448 (ice in get_source_location_for_substring, at input.c:1507)

Backported from mainline
	2017-12-21  Jakub Jelinek  <jakub@redhat.com>

	PR c/83448
	* gimple-ssa-sprintf.c (maybe_warn): Don't call set_caret_index
	if navail is >= dir.len.

	* gcc.c-torture/compile/pr83448.c: New test.
	* gcc.dg/tree-ssa/builtin-snprintf-warn-4.c: New test.

From-SVN: r255972
This commit is contained in:
Jakub Jelinek 2017-12-22 09:54:26 +01:00 committed by Jakub Jelinek
parent 7dc36181a0
commit b4b883cee3
5 changed files with 73 additions and 2 deletions

View File

@ -3,6 +3,10 @@
Backported from mainline Backported from mainline
2017-12-21 Jakub Jelinek <jakub@redhat.com> 2017-12-21 Jakub Jelinek <jakub@redhat.com>
PR c/83448
* gimple-ssa-sprintf.c (maybe_warn): Don't call set_caret_index
if navail is >= dir.len.
PR rtl-optimization/80747 PR rtl-optimization/80747
PR rtl-optimization/83512 PR rtl-optimization/83512
* cfgrtl.c (force_nonfallthru_and_redirect): When splitting * cfgrtl.c (force_nonfallthru_and_redirect): When splitting

View File

@ -2294,6 +2294,7 @@ maybe_warn (substring_loc &dirloc, source_range *pargrange,
/* For plain character directives (i.e., the format string itself) /* For plain character directives (i.e., the format string itself)
but not others, point the caret at the first character that's but not others, point the caret at the first character that's
past the end of the destination. */ past the end of the destination. */
if (navail < dir.len)
dirloc.set_caret_index (dirloc.get_caret_idx () + navail); dirloc.set_caret_index (dirloc.get_caret_idx () + navail);
} }
@ -2423,6 +2424,7 @@ maybe_warn (substring_loc &dirloc, source_range *pargrange,
/* For plain character directives (i.e., the format string itself) /* For plain character directives (i.e., the format string itself)
but not others, point the caret at the first character that's but not others, point the caret at the first character that's
past the end of the destination. */ past the end of the destination. */
if (navail < dir.len)
dirloc.set_caret_index (dirloc.get_caret_idx () + navail); dirloc.set_caret_index (dirloc.get_caret_idx () + navail);
} }

View File

@ -3,6 +3,10 @@
Backported from mainline Backported from mainline
2017-12-21 Jakub Jelinek <jakub@redhat.com> 2017-12-21 Jakub Jelinek <jakub@redhat.com>
PR c/83448
* gcc.c-torture/compile/pr83448.c: New test.
* gcc.dg/tree-ssa/builtin-snprintf-warn-4.c: New test.
PR rtl-optimization/80747 PR rtl-optimization/80747
PR rtl-optimization/83512 PR rtl-optimization/83512
* gcc.dg/pr80747.c: New test. * gcc.dg/pr80747.c: New test.

View File

@ -0,0 +1,15 @@
/* PR c/83448 */
char *a;
int b;
void
foo (void)
{
for (;;)
{
if (b < 0)
foo ();
__builtin_snprintf (a, b, "%*s", b, "");
}
}

View File

@ -0,0 +1,46 @@
/* PR c/83448 */
/* { dg-do compile } */
/* { dg-options "-O2 -Wformat-truncation -fdiagnostics-show-caret" } */
extern int snprintf (char *, __SIZE_TYPE__, const char *, ...);
void
foo (char *a, char *b, char *c, int d, int e)
{
snprintf (a, 7, "abc\\\123 efg");
/* { dg-warning "directive output truncated writing 9 bytes into a region of size 7" "" { target *-*-* } .-1 }
{ dg-message ".snprintf. output 10 bytes into a destination of size 7" "note" { target *-*-* } .-2 }
{ dg-begin-multiline-output "" }
snprintf (a, 7, "abc\\\123 efg");
~~~~~~~~~~~^~
{ dg-end-multiline-output "" }
{ dg-begin-multiline-output "note" }
snprintf (a, 7, "abc\\\123 efg");
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{ dg-end-multiline-output "" } */
d &= 63;
d += 10;
snprintf (b, 7, "a%dbcdefg", d);
/* { dg-warning "'bcdefg' directive output truncated writing 6 bytes into a region of size 4" "" { target *-*-* } .-1 }
{ dg-message ".snprintf. output 10 bytes into a destination of size 7" "note" { target *-*-* } .-2 }
{ dg-begin-multiline-output "" }
snprintf (b, 7, "a%dbcdefg", d);
~~~~^~
{ dg-end-multiline-output "" }
{ dg-begin-multiline-output "note" }
snprintf (b, 7, "a%dbcdefg", d);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{ dg-end-multiline-output "" } */
e &= 127;
snprintf (c, 7, "a%dbcdefgh", e);
/* { dg-warning "'bcdefgh' directive output truncated writing 7 bytes into a region of size between 3 and 5" "" { target *-*-* } .-1 }
{ dg-message ".snprintf. output between 10 and 12 bytes into a destination of size 7" "note" { target *-*-* } .-2 }
{ dg-begin-multiline-output "" }
snprintf (c, 7, "a%dbcdefgh", e);
~~~~~^~
{ dg-end-multiline-output "" }
{ dg-begin-multiline-output "note" }
snprintf (c, 7, "a%dbcdefgh", e);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{ dg-end-multiline-output "" } */
}