Prevent ICEs due to bogus substring locations (PR preprocessor/79210)

gcc/ChangeLog:
	PR preprocessor/79210
	* input.c (get_substring_ranges_for_loc): Replace line_width
	assertion with error-handling.

gcc/testsuite/ChangeLog:
	PR preprocessor/79210
	* gcc.dg/format/pr79210.c: New test case.
	* gcc.dg/plugin/diagnostic-test-string-literals-2.c (test_pr79210):
	New function.

From-SVN: r245070
This commit is contained in:
David Malcolm 2017-01-31 20:22:43 +00:00 committed by David Malcolm
parent 5ae37bdfce
commit 7cfa044d99
5 changed files with 63 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2017-01-31 David Malcolm <dmalcolm@redhat.com>
PR preprocessor/79210
* input.c (get_substring_ranges_for_loc): Replace line_width
assertion with error-handling.
2017-01-31 Richard Biener <rguenther@suse.de>
PR tree-optimization/77318

View File

@ -1395,7 +1395,10 @@ get_substring_ranges_for_loc (cpp_reader *pfile,
const char *literal = line + start.column - 1;
int literal_length = finish.column - start.column + 1;
gcc_assert (line_width >= (start.column - 1 + literal_length));
/* Ensure that we don't crash if we got the wrong location. */
if (line_width < (start.column - 1 + literal_length))
return "line is not wide enough";
cpp_string from;
from.len = literal_length;
/* Make a copy of the literal, to avoid having to rely on

View File

@ -1,3 +1,10 @@
2017-01-31 David Malcolm <dmalcolm@redhat.com>
PR preprocessor/79210
* gcc.dg/format/pr79210.c: New test case.
* gcc.dg/plugin/diagnostic-test-string-literals-2.c (test_pr79210):
New function.
2017-01-31 Nathan Sidwell <nathan@acm.org>
PR c++/79290

View File

@ -0,0 +1,23 @@
/* { dg-do compile } */
/* { dg-options "-Wformat -Wformat-signedness" } */
__attribute__((format(printf, 3, 4)))
void dev_printk(const char *level, void *dev, const char *fmt, ...);
#define lpfc_vport_param_init(attr) \
void lpfc_##attr##_init(void *vport, unsigned int val) \
{ \
dev_printk("3", (void *)0, \
"0423 lpfc_"#attr" attribute cannot be set to %d, "\
"allowed range is [0, 1]\n", val); \
}
#define LPFC_VPORT_ATTR_R(name, desc) \
unsigned int lpfc_##name;\
lpfc_vport_param_init(name)\
LPFC_VPORT_ATTR_R(peer_port_login,
"Allow peer ports on the same physical port to login to each "
"other.");
/* { dg-warning "6: format .%d. expects argument of type .int., but argument 4 has type .unsigned int. " "" { target *-*-* } .-12 } */

View File

@ -51,3 +51,26 @@ test_stringified_token_3 (int x)
#undef FOO
}
/* Test of a stringified macro argument within a concatenation. */
void
test_pr79210 (void)
{
#define lpfc_vport_param_init(attr) \
__emit_string_literal_range ( \
"0423 lpfc_"#attr" attribute cannot be set to %d, "\
"allowed range is [0, 1]\n", 54, 53, 54) \
#define LPFC_VPORT_ATTR_R(name, decc) \
unsigned int lpfc_##name; \
lpfc_vport_param_init(name) \
LPFC_VPORT_ATTR_R(peer_port_login,
"some multiline blurb with a short final line "
"here");
/* { dg-error "19: unable to read substring location: line is not wide enough" "" { target *-*-* } .-11 } */
#undef LPFC_VPORT_ATTR_R
#undef lpfc_vport_param_init
}