mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 22:52:11 +02:00
Fix for 186065: StringIndexOutOfBoundsException in GCCScannerInfoConsoleParser
Patch by Sergey Prigogin (Google)
This commit is contained in:
parent
9aed98b36d
commit
ebc8d3f9d6
2 changed files with 94 additions and 67 deletions
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2004, 2006 IBM Corporation and others.
|
||||
* Copyright (c) 2004, 2007 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.make.builder.tests;
|
||||
|
||||
|
@ -73,45 +74,45 @@ public class ScannerConfigConsoleParserTests extends TestCase {
|
|||
// initialize it with the utility
|
||||
clParser.startup(null, null, collector, null);
|
||||
|
||||
clParser.processLine("gcc -I /dir/include -I C:\\dir\\include -ID:/dir/include -c test.c"); // absolute paths
|
||||
clParser.processLine("gcc -I -I /dir2/include -c test.c"); // empty -I
|
||||
clParser.processLine("gcc -I../back_dir/include -I./cur_dir/include -c test.c"); // relative paths
|
||||
clParser.processLine("gcc '-I /squoted/dir1' -I '/squoted/dir2' -I'/squoted/dir3' -c test.c"); // single quote dirs
|
||||
clParser.processLine("gcc \"-I /dquoted/dir1\" -I \"/dquoted/dir2\" -I\"/dquoted/dir3\" -c test.c"); // double quote dirs
|
||||
clParser.processLine("gcc '-I /with spaces 1' -I'/with spaces 2' -c test.c"); // dirs with spaces 1,2
|
||||
clParser.processLine("gcc \"-I /with spaces 3\" -I \"/with spaces 4\" -c test.c"); // dirs with spaces 3,4
|
||||
clParser.processLine("gcc -I /with\\ spaces\\ 5 -c test.c"); // dirs with spaces 5
|
||||
clParser.processLine("gcc -I '\\\\server1\\include' '-I\\\\server2\\include' -I \"\\\\server3\\include\" -c test.c"); // UNC paths
|
||||
clParser.processLine("gcc -I //server4/include -I '//server5/include' '-I//server6/include' -c test.c"); // UNC paths
|
||||
clParser.processLine("gcc -I \\");
|
||||
clParser.processLine("/multiline\\");
|
||||
clParser.processLine("/dir -c test.c"); // multiline
|
||||
clParser.processLine("gcc -I /dir/include -I C:\\dir\\include -ID:/dir/include -c test.c"); // absolute paths //$NON-NLS-1$
|
||||
clParser.processLine("gcc -I -I /dir2/include -c test.c"); // empty -I //$NON-NLS-1$
|
||||
clParser.processLine("gcc -I../back_dir/include -I./cur_dir/include -c test.c"); // relative paths //$NON-NLS-1$
|
||||
clParser.processLine("gcc '-I /squoted/dir1' -I '/squoted/dir2' -I'/squoted/dir3' -c test.c"); // single quote dirs //$NON-NLS-1$
|
||||
clParser.processLine("gcc \"-I /dquoted/dir1\" -I \"/dquoted/dir2\" -I\"/dquoted/dir3\" -c test.c"); // double quote dirs //$NON-NLS-1$
|
||||
clParser.processLine("gcc '-I /with spaces 1' -I'/with spaces 2' -c test.c"); // dirs with spaces 1,2 //$NON-NLS-1$
|
||||
clParser.processLine("gcc \"-I /with spaces 3\" -I \"/with spaces 4\" -c test.c"); // dirs with spaces 3,4 //$NON-NLS-1$
|
||||
clParser.processLine("gcc -I /with\\ spaces\\ 5 -c test.c"); // dirs with spaces 5 //$NON-NLS-1$
|
||||
clParser.processLine("gcc -I '\\\\server1\\include' '-I\\\\server2\\include' -I \"\\\\server3\\include\" -c test.c"); // UNC paths //$NON-NLS-1$
|
||||
clParser.processLine("gcc -I //server4/include -I '//server5/include' '-I//server6/include' -c test.c"); // UNC paths //$NON-NLS-1$
|
||||
clParser.processLine("gcc -I \\"); //$NON-NLS-1$
|
||||
clParser.processLine("/multiline\\"); //$NON-NLS-1$
|
||||
clParser.processLine("/dir -c test.c"); // multiline //$NON-NLS-1$
|
||||
|
||||
List sumIncludes = collector.getCollectedScannerInfo(null, ScannerInfoTypes.INCLUDE_PATHS);
|
||||
assertTrue(sumIncludes.contains("/dir/include"));
|
||||
assertTrue(sumIncludes.contains("C:\\dir\\include"));
|
||||
assertTrue(sumIncludes.contains("D:/dir/include"));
|
||||
assertTrue(sumIncludes.contains("/dir2/include"));
|
||||
assertTrue(sumIncludes.contains("../back_dir/include"));
|
||||
assertTrue(sumIncludes.contains("./cur_dir/include"));
|
||||
assertTrue(sumIncludes.contains("/squoted/dir1"));
|
||||
assertTrue(sumIncludes.contains("/squoted/dir2"));
|
||||
assertTrue(sumIncludes.contains("/squoted/dir3"));
|
||||
assertTrue(sumIncludes.contains("/dquoted/dir1"));
|
||||
assertTrue(sumIncludes.contains("/dquoted/dir2"));
|
||||
assertTrue(sumIncludes.contains("/dquoted/dir3"));
|
||||
assertTrue(sumIncludes.contains("/with spaces 1"));
|
||||
assertTrue(sumIncludes.contains("/with spaces 2"));
|
||||
assertTrue(sumIncludes.contains("/with spaces 3"));
|
||||
assertTrue(sumIncludes.contains("/with spaces 4"));
|
||||
assertTrue(sumIncludes.contains("/with spaces 5"));
|
||||
assertTrue(sumIncludes.contains("\\\\server1\\include"));
|
||||
assertTrue(sumIncludes.contains("\\\\server2\\include"));
|
||||
assertTrue(sumIncludes.contains("\\\\server3\\include"));
|
||||
assertTrue(sumIncludes.contains("//server4/include"));
|
||||
assertTrue(sumIncludes.contains("//server5/include"));
|
||||
assertTrue(sumIncludes.contains("//server6/include"));
|
||||
assertTrue(sumIncludes.contains("/multiline/dir"));
|
||||
assertTrue(sumIncludes.contains("/dir/include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("C:\\dir\\include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("D:/dir/include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/dir2/include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("../back_dir/include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("./cur_dir/include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/squoted/dir1")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/squoted/dir2")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/squoted/dir3")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/dquoted/dir1")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/dquoted/dir2")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/dquoted/dir3")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/with spaces 1")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/with spaces 2")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/with spaces 3")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/with spaces 4")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/with spaces 5")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("\\\\server1\\include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("\\\\server2\\include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("\\\\server3\\include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("//server4/include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("//server5/include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("//server6/include")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.contains("/multiline/dir")); //$NON-NLS-1$
|
||||
assertTrue(sumIncludes.size() == 24);
|
||||
}
|
||||
|
||||
|
@ -131,33 +132,33 @@ public class ScannerConfigConsoleParserTests extends TestCase {
|
|||
// initialize it with the utility
|
||||
clParser.startup(null, null, collector, null);
|
||||
|
||||
clParser.processLine("gcc -DMACRO1 -D MACRO2=value2 -c test.c"); // simple definitions
|
||||
clParser.processLine("gcc -D -DMACRO3 -c test.c"); // empty -D
|
||||
clParser.processLine("gcc -D MACRO4='value4' -D 'MACRO5=value5' '-D MACRO6 = value6' -c test.c"); // single quotes
|
||||
clParser.processLine("gcc -D'MACRO7=\"value 7\"' -D MACRO8='\"value 8\"' -c test.c"); // single quotes
|
||||
clParser.processLine("gcc -DMACRO9=\"value9\" -D \"MACRO10=value10\" \"-D MACRO11 = value11\" -c test.c"); // double quotes
|
||||
clParser.processLine("gcc -D\"MACRO12=\\\"value 12\\\"\" -D MACRO13=\"\\\"value 13\\\"\" -c test.c"); // single quotes
|
||||
clParser.processLine("gcc -D \\");
|
||||
clParser.processLine("MULTILINE=TRUE \\");
|
||||
clParser.processLine("-c test.c"); // multiline
|
||||
clParser.processLine("gcc -D 'SUM(x, y) = (x) + (y)' -c test.c"); // more complex macro definition
|
||||
clParser.processLine("gcc -DMACRO1 -D MACRO2=value2 -c test.c"); // simple definitions //$NON-NLS-1$
|
||||
clParser.processLine("gcc -D -DMACRO3 -c test.c"); // empty -D //$NON-NLS-1$
|
||||
clParser.processLine("gcc -D MACRO4='value4' -D 'MACRO5=value5' '-D MACRO6 = value6' -c test.c"); // single quotes //$NON-NLS-1$
|
||||
clParser.processLine("gcc -D'MACRO7=\"value 7\"' -D MACRO8='\"value 8\"' -c test.c"); // single quotes //$NON-NLS-1$
|
||||
clParser.processLine("gcc -DMACRO9=\"value9\" -D \"MACRO10=value10\" \"-D MACRO11 = value11\" -c test.c"); // double quotes //$NON-NLS-1$
|
||||
clParser.processLine("gcc -D\"MACRO12=\\\"value 12\\\"\" -D MACRO13=\"\\\"value 13\\\"\" -c test.c"); // single quotes //$NON-NLS-1$
|
||||
clParser.processLine("gcc -D \\"); //$NON-NLS-1$
|
||||
clParser.processLine("MULTILINE=TRUE \\"); //$NON-NLS-1$
|
||||
clParser.processLine("-c test.c"); // multiline //$NON-NLS-1$
|
||||
clParser.processLine("gcc -D 'SUM(x, y) = (x) + (y)' -c test.c"); // more complex macro definition //$NON-NLS-1$
|
||||
|
||||
List sumSymbols = collector.getCollectedScannerInfo(null, ScannerInfoTypes.SYMBOL_DEFINITIONS);
|
||||
assertTrue(sumSymbols.contains("MACRO1"));
|
||||
assertTrue(sumSymbols.contains("MACRO2=value2"));
|
||||
assertTrue(sumSymbols.contains("MACRO3"));
|
||||
assertTrue(sumSymbols.contains("MACRO4=value4"));
|
||||
assertTrue(sumSymbols.contains("MACRO5=value5"));
|
||||
assertTrue(sumSymbols.contains("MACRO6 = value6"));
|
||||
assertTrue(sumSymbols.contains("MACRO7=\"value 7\""));
|
||||
assertTrue(sumSymbols.contains("MACRO8=\"value 8\""));
|
||||
assertTrue(sumSymbols.contains("MACRO9=value9"));
|
||||
assertTrue(sumSymbols.contains("MACRO10=value10"));
|
||||
assertTrue(sumSymbols.contains("MACRO11 = value11"));
|
||||
assertTrue(sumSymbols.contains("MACRO12=\"value 12\""));
|
||||
assertTrue(sumSymbols.contains("MACRO13=\"value 13\""));
|
||||
assertTrue(sumSymbols.contains("MULTILINE=TRUE"));
|
||||
assertTrue(sumSymbols.contains("SUM(x, y) = (x) + (y)"));
|
||||
assertTrue(sumSymbols.contains("MACRO1")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO2=value2")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO3")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO4=value4")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO5=value5")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO6 = value6")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO7=\"value 7\"")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO8=\"value 8\"")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO9=value9")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO10=value10")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO11 = value11")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO12=\"value 12\"")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MACRO13=\"value 13\"")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("MULTILINE=TRUE")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.contains("SUM(x, y) = (x) + (y)")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.size() == 15);
|
||||
}
|
||||
|
||||
|
@ -177,10 +178,34 @@ public class ScannerConfigConsoleParserTests extends TestCase {
|
|||
// initialize it with the utility
|
||||
clParser.startup(null, null, collector, null);
|
||||
|
||||
clParser.processLine("gcc -DMACRO1 -I ..\\inc -c ..\\source\\source.c"); // PR 80271
|
||||
clParser.processLine("gcc -DMACRO1 -I ..\\inc -c ..\\source\\source.c"); // PR 80271 //$NON-NLS-1$
|
||||
|
||||
List sumSymbols = collector.getCollectedScannerInfo(null, ScannerInfoTypes.SYMBOL_DEFINITIONS);
|
||||
assertTrue(sumSymbols.contains("MACRO1"));
|
||||
assertTrue(sumSymbols.contains("MACRO1")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.size() == 1);
|
||||
}
|
||||
|
||||
public void testParsingUnbalancedDoubleQuote_Bug186065() throws Exception {
|
||||
IScannerInfoCollector collector = new IScannerInfoCollector() {
|
||||
private List sumSymbols = new ArrayList();
|
||||
public void contributeToScannerConfig(Object resource, Map scannerInfo) {
|
||||
sumSymbols.addAll((List) scannerInfo.get(ScannerInfoTypes.SYMBOL_DEFINITIONS));
|
||||
}
|
||||
public List getCollectedScannerInfo(Object resource, ScannerInfoTypes type) {
|
||||
if (type.equals(ScannerInfoTypes.SYMBOL_DEFINITIONS)) {
|
||||
return sumSymbols;
|
||||
}
|
||||
return new ArrayList();
|
||||
}
|
||||
};
|
||||
// initialize it with the utility
|
||||
clParser.startup(null, null, collector, null);
|
||||
|
||||
clParser.processLine("../src/bug186065.cc:8: error: missing terminating \" character"); // PR 80271 //$NON-NLS-1$
|
||||
clParser.processLine("gcc -DBUG186065_IS_FIXED"); //$NON-NLS-1$
|
||||
|
||||
List sumSymbols = collector.getCollectedScannerInfo(null, ScannerInfoTypes.SYMBOL_DEFINITIONS);
|
||||
assertTrue(sumSymbols.contains("BUG186065_IS_FIXED")); //$NON-NLS-1$
|
||||
assertTrue(sumSymbols.size() == 1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2004, 2006 IBM Corporation and others.
|
||||
* Copyright (c) 2004, 2007 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -8,6 +8,7 @@
|
|||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
* Martin Oberhuber (Wind River Systems) - bug 155096
|
||||
* Sergey Prigogin (Google)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.make.internal.core.scannerconfig.gnu;
|
||||
|
||||
|
@ -124,7 +125,8 @@ public class GCCScannerInfoConsoleParser extends AbstractGCCBOPConsoleParser {
|
|||
}
|
||||
else if (fileName == null) {
|
||||
String possibleFileName = token.toLowerCase();
|
||||
if ((possibleFileName.startsWith(DOUBLE_QUOTE_STRING) &&
|
||||
if (possibleFileName.length() >= 5 && // Two quotes plus 3 characters for file name.
|
||||
(possibleFileName.startsWith(DOUBLE_QUOTE_STRING) &&
|
||||
possibleFileName.endsWith(DOUBLE_QUOTE_STRING)) ||
|
||||
(possibleFileName.startsWith(SINGLE_QUOTE_STRING) &&
|
||||
possibleFileName.endsWith(SINGLE_QUOTE_STRING))) {
|
||||
|
|
Loading…
Add table
Reference in a new issue