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:
parent
5ae37bdfce
commit
7cfa044d99
5 changed files with 63 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
23
gcc/testsuite/gcc.dg/format/pr79210.c
Normal file
23
gcc/testsuite/gcc.dg/format/pr79210.c
Normal 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 } */
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue