1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-04 07:35:24 +02:00

handle exceptions and prevent infinite loops. 73652

This commit is contained in:
Andrew Niefer 2004-09-10 16:20:30 +00:00
parent a59a690bb9
commit 8c5c7a12e5
3 changed files with 59 additions and 6 deletions

View file

@ -2084,4 +2084,15 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertFalse(i.hasNext());
}
public void testBug73652() throws Exception
{
StringWriter writer = new StringWriter();
writer.write( "#define DoSuperMethodA IDoSuperMethodA\n" ); //$NON-NLS-1$
writer.write( "#define IDoSuperMethodA(a,b,c) IIntuition->IDoSuperMethodA(a,b,c)\n" ); //$NON-NLS-1$
writer.write( "void hang(void)\n" ); //$NON-NLS-1$
writer.write( "{\n" ); //$NON-NLS-1$
writer.write( "DoSuperMethodA(0,0,0);\n" ); //$NON-NLS-1$
writer.write( "}\n" ); //$NON-NLS-1$
parse( writer.toString() , false );
}
}

View file

@ -1814,4 +1814,17 @@ public class Scanner2Test extends BaseScanner2Test
validateToken( IToken.t_int );
assertEquals( problems.size(), 1 );
}
public void testBug73652() throws Exception
{
StringWriter writer = new StringWriter();
writer.write( "#define DoSuperMethodA IDoSuperMethodA\n" ); //$NON-NLS-1$
writer.write( "#define IDoSuperMethodA(a,b,c) IIntuition->IDoSuperMethodA(a,b,c)\n" ); //$NON-NLS-1$
writer.write( "void hang(void)\n" ); //$NON-NLS-1$
writer.write( "{\n" ); //$NON-NLS-1$
writer.write( "DoSuperMethodA(0,0,0);\n" ); //$NON-NLS-1$
writer.write( "}\n" ); //$NON-NLS-1$
initializeScanner( writer.toString() );
fullyTokenize();
}
}

View file

@ -362,9 +362,18 @@ public class Scanner2 implements IScanner, IScannerData {
* @see org.eclipse.cdt.core.parser.IScanner#nextToken()
*/
public IToken nextToken() throws ScannerException, EndOfFileException {
boolean exception = false;
if (nextToken == null && !finished ) {
try
{
nextToken = fetchToken();
if (nextToken == null)
}
catch( Exception e )
{
exception = true;
errorHandle();
}
if (nextToken == null && !exception)
{
finished = true;
}
@ -385,10 +394,22 @@ public class Scanner2 implements IScanner, IScannerData {
lastToken.setNext(nextToken);
IToken oldToken = lastToken;
lastToken = nextToken;
nextToken = fetchToken();
if (nextToken == null)
try
{
nextToken = fetchToken();
}
catch( Exception e )
{
nextToken = null;
exception = true;
errorHandle();
}
if (nextToken == null ){
if(!exception)
finished = true;
}
else if (nextToken.getType() == IToken.tPOUNDPOUND) {
// time for a pasting
IToken token2 = fetchToken();
@ -418,6 +439,13 @@ public class Scanner2 implements IScanner, IScannerData {
return lastToken;
}
/**
*
*/
protected void errorHandle() {
++bufferPos[bufferStackPos];
}
/**
*
*/
@ -2195,7 +2223,8 @@ public class Scanner2 implements IScanner, IScannerData {
int limit = bufferLimit[bufferStackPos];
skipOverWhiteSpace();
while( buffer[bufferPos[bufferStackPos]] == '\\' &&
while( bufferPos[bufferStackPos] < limit &&
buffer[bufferPos[bufferStackPos]] == '\\' &&
bufferPos[bufferStackPos] + 1 < buffer.length &&
buffer[bufferPos[bufferStackPos]+1] == '\n' )
{