aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2017-01-31 20:22:43 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2017-01-31 20:22:43 +0000
commit7cfa044d991a2622ca82c92b042ca06824994acd (patch)
tree08067378539cdf2cf09a589aa4ac65142975bfdb /gcc
parent5ae37bdfce3f433ff51af4d614d9271abb25671f (diff)
downloadgcc-7cfa044d991a2622ca82c92b042ca06824994acd.zip
gcc-7cfa044d991a2622ca82c92b042ca06824994acd.tar.gz
gcc-7cfa044d991a2622ca82c92b042ca06824994acd.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/input.c5
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/format/pr79210.c23
-rw-r--r--gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-2.c23
5 files changed, 63 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6f8d860..a264140 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/input.c b/gcc/input.c
index 3e67314..38deb62 100644
--- a/gcc/input.c
+++ b/gcc/input.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 302843d..f7cf0f4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.dg/format/pr79210.c b/gcc/testsuite/gcc.dg/format/pr79210.c
new file mode 100644
index 0000000..71f5dd6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/format/pr79210.c
@@ -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 } */
diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-2.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-2.c
index 25cb3f0..e916b93 100644
--- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-2.c
+++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-2.c
@@ -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
+}