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
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/83512
* cfgrtl.c (force_nonfallthru_and_redirect): When splitting

View File

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

View File

@ -3,6 +3,10 @@
Backported from mainline
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/83512
* 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 "" } */
}