From 9af69e200ca2411bc39beae63d404ea8b57aa7c5 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Fri, 10 Sep 2004 18:06:03 +0000 Subject: [PATCH] fix ArrayIndexOutOfBoundsException and avoid infinite loops caused by exceptions leaving the scanner. 73652 --- .../parser/tests/CompleteParseASTTest.java | 11 +++++ .../parser/tests/scanner2/Scanner2Test.java | 13 ++++++ .../core/parser/scanner2/Scanner2.java | 41 ++++++++++++++++--- 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index 398524969b2..a4a49d19f62 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -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 ); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java index fa95a693380..86f43152dcd 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java @@ -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(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java index 4adaab58a00..6489d8c5d3b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java @@ -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' ) {