[Ada] gnatxref: infinite loop on symbols not found

This patch fixes a bug in which if a symbol is not found, gnatxref can
sometimes enter an infinite loop. No impact on compilation.

2019-09-19  Bob Duff  <duff@adacore.com>

gcc/ada/

	* xref_lib.adb (Get_Symbol_Name): If we reach EOF in the first
	loop without finding the symbol, return "???". Otherwise, it's
	an infinite loop.
	(Parse_EOL): Assert that we're not already at EOF.  Remove
	processing of LF/CR -- there are no operating systems that use
	that.

From-SVN: r275932
This commit is contained in:
Bob Duff 2019-09-19 08:12:47 +00:00 committed by Pierre-Marie de Rodat
parent 5d66b937e3
commit e516702202
2 changed files with 18 additions and 8 deletions

View File

@ -1,3 +1,12 @@
2019-09-19 Bob Duff <duff@adacore.com>
* xref_lib.adb (Get_Symbol_Name): If we reach EOF in the first
loop without finding the symbol, return "???". Otherwise, it's
an infinite loop.
(Parse_EOL): Assert that we're not already at EOF. Remove
processing of LF/CR -- there are no operating systems that use
that.
2019-09-19 Eric Botcazou <ebotcazou@adacore.com>
* exp_ch6.adb (Is_Legal_Copy): Also return false for an aliased

View File

@ -723,6 +723,8 @@ package body Xref_Lib is
is
begin
loop
pragma Assert (Source (Ptr) /= EOF);
-- Skip to end of line
while Source (Ptr) /= ASCII.CR and then Source (Ptr) /= ASCII.LF
@ -737,11 +739,9 @@ package body Xref_Lib is
Ptr := Ptr + 1;
end if;
-- Skip past CR/LF or LF/CR combination
-- Skip past CR/LF
if (Source (Ptr) = ASCII.CR or else Source (Ptr) = ASCII.LF)
and then Source (Ptr) /= Source (Ptr - 1)
then
if Source (Ptr - 1) = ASCII.CR and then Source (Ptr) = ASCII.LF then
Ptr := Ptr + 1;
end if;
@ -783,6 +783,7 @@ package body Xref_Lib is
-- line and column in the dependent unit number Eun. For this we need
-- to parse the ali file again because the parent entity is not in
-- the declaration table if it did not match the search pattern.
-- If the symbol is not found, we return "???".
procedure Skip_To_Matching_Closing_Bracket;
-- When Ptr points to an opening square bracket, moves it to the
@ -803,6 +804,10 @@ package body Xref_Lib is
-- Look for the X lines corresponding to unit Eun
loop
if Ali (Ptr) = EOF then
return "???";
end if;
if Ali (Ptr) = 'X' then
Ptr := Ptr + 1;
Parse_Number (Ali, Ptr, E_Eun);
@ -832,10 +837,6 @@ package body Xref_Lib is
exit when Ali (Ptr) = EOF;
end loop;
-- We were not able to find the symbol, this should not happen but
-- since we don't want to stop here we return a string of three
-- question marks as the symbol name.
return "???";
end Get_Symbol_Name;