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:
parent
bdcd736bb3
commit
9af69e200c
3 changed files with 59 additions and 6 deletions
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 ) {
|
||||
nextToken = fetchToken();
|
||||
if (nextToken == null)
|
||||
try
|
||||
{
|
||||
nextToken = fetchToken();
|
||||
}
|
||||
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)
|
||||
finished = true;
|
||||
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' )
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue