diff options
author | David Malcolm <dmalcolm@redhat.com> | 2018-10-29 23:58:34 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2018-10-29 23:58:34 +0000 |
commit | 3d0a5393466ef5d2755dd0dc8e8c10750e9bb4b9 (patch) | |
tree | fe13868d9238eb20dea3293cffca6f47e0d55a92 /gcc/input.c | |
parent | 7e2de6df10b532be4e66025e318f68a0ebf2c408 (diff) | |
download | gcc-3d0a5393466ef5d2755dd0dc8e8c10750e9bb4b9.zip gcc-3d0a5393466ef5d2755dd0dc8e8c10750e9bb4b9.tar.gz gcc-3d0a5393466ef5d2755dd0dc8e8c10750e9bb4b9.tar.bz2 |
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.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/gcc/input.c b/gcc/input.c index 57a1a3c..a94a010 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 |