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());
|
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 );
|
validateToken( IToken.t_int );
|
||||||
assertEquals( problems.size(), 1 );
|
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()
|
* @see org.eclipse.cdt.core.parser.IScanner#nextToken()
|
||||||
*/
|
*/
|
||||||
public IToken nextToken() throws EndOfFileException {
|
public IToken nextToken() throws EndOfFileException {
|
||||||
|
boolean exception = false;
|
||||||
if (nextToken == null && !finished ) {
|
if (nextToken == null && !finished ) {
|
||||||
nextToken = fetchToken();
|
try
|
||||||
if (nextToken == null)
|
{
|
||||||
|
nextToken = fetchToken();
|
||||||
|
}
|
||||||
|
catch( Exception e )
|
||||||
|
{
|
||||||
|
exception = true;
|
||||||
|
errorHandle();
|
||||||
|
}
|
||||||
|
if (nextToken == null && !exception)
|
||||||
{
|
{
|
||||||
finished = true;
|
finished = true;
|
||||||
}
|
}
|
||||||
|
@ -374,10 +383,22 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
lastToken.setNext(nextToken);
|
lastToken.setNext(nextToken);
|
||||||
IToken oldToken = lastToken;
|
IToken oldToken = lastToken;
|
||||||
lastToken = nextToken;
|
lastToken = nextToken;
|
||||||
nextToken = fetchToken();
|
|
||||||
|
|
||||||
if (nextToken == null)
|
try
|
||||||
finished = true;
|
{
|
||||||
|
nextToken = fetchToken();
|
||||||
|
}
|
||||||
|
catch( Exception e )
|
||||||
|
{
|
||||||
|
nextToken = null;
|
||||||
|
exception = true;
|
||||||
|
errorHandle();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextToken == null ){
|
||||||
|
if(!exception)
|
||||||
|
finished = true;
|
||||||
|
}
|
||||||
else if (nextToken.getType() == IToken.tPOUNDPOUND) {
|
else if (nextToken.getType() == IToken.tPOUNDPOUND) {
|
||||||
// time for a pasting
|
// time for a pasting
|
||||||
IToken token2 = fetchToken();
|
IToken token2 = fetchToken();
|
||||||
|
@ -407,6 +428,13 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
return lastToken;
|
return lastToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected void errorHandle() {
|
||||||
|
++bufferPos[bufferStackPos];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -2184,7 +2212,8 @@ public class Scanner2 implements IScanner, IScannerData {
|
||||||
int limit = bufferLimit[bufferStackPos];
|
int limit = bufferLimit[bufferStackPos];
|
||||||
|
|
||||||
skipOverWhiteSpace();
|
skipOverWhiteSpace();
|
||||||
while( buffer[bufferPos[bufferStackPos]] == '\\' &&
|
while( bufferPos[bufferStackPos] < limit &&
|
||||||
|
buffer[bufferPos[bufferStackPos]] == '\\' &&
|
||||||
bufferPos[bufferStackPos] + 1 < buffer.length &&
|
bufferPos[bufferStackPos] + 1 < buffer.length &&
|
||||||
buffer[bufferPos[bufferStackPos]+1] == '\n' )
|
buffer[bufferPos[bufferStackPos]+1] == '\n' )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue