summaryrefslogtreecommitdiff
path: root/gcc/input.c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2018-10-29 23:58:34 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2018-10-29 23:58:34 +0000
commit3d0a5393466ef5d2755dd0dc8e8c10750e9bb4b9 (patch)
treefe13868d9238eb20dea3293cffca6f47e0d55a92 /gcc/input.c
parent7e2de6df10b532be4e66025e318f68a0ebf2c408 (diff)
Fix ICE in get_substring_ranges_for_loc on __FILE__ (PR c++/87721)
PR c++/87721 reports a crash in get_substring_ranges_for_loc introduced by r265271, my fix for PR 87562. The new issue occurs when attempting to get a location with a string literal inside a macro in which the first token is __FILE__ (formed via concatenation). Attempting to get the spelling location of __FILE__ fails, leading to NULL for start_ord_map and final_ord_map, and thus a NULL pointer dereference. Given that our "on-demand" substring locations approach reparses the string literals, there isn't a good way to access the locations inside such string literals: attempting to reparse __FILE__ fails with a "missing open quote". This patch applies the easy fix by gracefully rejecting the case where the spelling locations for the start or finish give us NULL maps. gcc/ChangeLog: PR c++/87721 * input.c (get_substring_ranges_for_loc): Detect if linemap_resolve_location gives us a NULL map, and reject this case. gcc/testsuite/ChangeLog: PR c++/87721 * c-c++-common/substring-location-PR-87721.c: New test. * gcc.dg/plugin/diagnostic-test-string-literals-1.c: Add test for PR 87721. * gcc.dg/plugin/diagnostic_plugin_test_string_literals.c (test_string_literals): Fold the index arguments before checking for INTEGER_CST. From-SVN: r265611
Diffstat (limited to 'gcc/input.c')
-rw-r--r--gcc/input.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/gcc/input.c b/gcc/input.c
index 57a1a3c42d3..a94a010f353 100644
--- a/gcc/input.c
+++ b/gcc/input.c
@@ -1463,6 +1463,8 @@ get_substring_ranges_for_loc (cpp_reader *pfile,
const line_map_ordinary *final_ord_map;
linemap_resolve_location (line_table, src_range.m_finish,
LRK_SPELLING_LOCATION, &final_ord_map);
+ if (start_ord_map == NULL || final_ord_map == NULL)
+ return "failed to get ordinary maps";
/* Bulletproofing. We ought to only have different ordinary maps
for start vs finish due to line-length jumps. */
if (start_ord_map != final_ord_map