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:
parent
7dc36181a0
commit
b4b883cee3
|
@ -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
|
||||||
|
|
|
@ -2294,7 +2294,8 @@ 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. */
|
||||||
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')
|
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)
|
/* 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. */
|
||||||
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')
|
if (*dir.beg == '\0')
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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, "");
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 "" } */
|
||||||
|
}
|
Loading…
Reference in New Issue