1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

fix ArrayIndexOutOfBoundsException and avoid infinite loops caused by

exceptions leaving the scanner.  73652
This commit is contained in:
Andrew Niefer 2004-09-10 18:06:03 +00:00
parent bdcd736bb3
commit 9af69e200c
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

@ -1727,4 +1727,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

@ -351,9 +351,18 @@ public class Scanner2 implements IScanner, IScannerData {
* @see org.eclipse.cdt.core.parser.IScanner#nextToken()
*/
public IToken nextToken() throws 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;
}
@ -374,10 +383,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();
@ -407,6 +428,13 @@ public class Scanner2 implements IScanner, IScannerData {
return lastToken;
}
/**
*
*/
protected void errorHandle() {
++bufferPos[bufferStackPos];
}
/**
*
*/
@ -2184,7 +2212,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' )
{