-
Notifications
You must be signed in to change notification settings - Fork 48
Some string interpolation combinations can cause hang / OutOfMemoryError #356
Copy link
Copy link
Closed
Description
This file will pass the parser:
class ParseTest: SomeClass {
let description = "\(firstVariable), \(secondVariable), \(thirdVariable), \(fourthVariable), \(fifthVar)"
}This file results in either a hang or an OutOfMemoryError:
class ParseTest: SomeClass {
let description = "\(firstVariable), \(secondVariable), \(thirdVariable), \(fourthVariable), \(fifthVari)"
}Note the additional character near the end of the middle line. It seems that the parser will break with some combinations of string length and number of string interpolations. I've been unable to determine exactly what thresholds trigger this, but here are some other lines that I've tested, followed by whether they work or hang the parser
let a = "\(firstVariable), \(secondVariable), \(thirdVariable), \(fourthVariableVariableTesting)" // works
let b = "\(firstVariable), \(secondVariable), \(thirdVariable), \(fourthVariable) \(variableTesting)" // hangs
let c = "\(firstVariable), \(secondVariable), \(thirdVariable), \(fourthVariableVariableTesting.test)" // works
let d = "\(firstVariable), \(secondVariable), \(thirdVariable), \(fourthVariable) \(variableTesting) \(test)" // hangs
let e = "\(firstVariable), \(secondVariable), \(thirdVariable), \(fourthVariableVariableTesting.test), \(test)" // hangs
let f = "\(firstVariable), \(secondVariable), \(thirdVariable), \(fourthVariableVariableTesting.test), test" //works
let g = "\(first), \(second), \(third), \(fourth), \(fifthVariable)" // works
let h = "\(first), \(second), \(third), \(fourth), \(fifthVariable) \(sixthVariable)" // hangs
let i = "\(first), \(second), \(third), \(fourth), \(fifth) \(sixth)" // worksExample stack traces from error:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.antlr.v4.runtime.atn.ATNConfigSet$AbstractConfigHashSet.createBuckets(ATNConfigSet.java:402)
at org.antlr.v4.runtime.atn.ATNConfigSet$AbstractConfigHashSet.createBuckets(ATNConfigSet.java:381)
at org.antlr.v4.runtime.misc.Array2DHashSet.expand(Array2DHashSet.java:166)
at org.antlr.v4.runtime.misc.Array2DHashSet.getOrAdd(Array2DHashSet.java:82)
at org.antlr.v4.runtime.atn.ATNConfigSet.add(ATNConfigSet.java:170)
at org.antlr.v4.runtime.atn.ATNConfigSet.add(ATNConfigSet.java:146)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:473)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:462)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:462)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:462)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:462)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:462)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:462)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:462)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:462)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:462)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at org.antlr.v4.runtime.atn.ATNConfigSet$AbstractConfigHashSet.createBucket(ATNConfigSet.java:407)
at org.antlr.v4.runtime.atn.ATNConfigSet$AbstractConfigHashSet.createBucket(ATNConfigSet.java:381)
at org.antlr.v4.runtime.misc.Array2DHashSet.expand(Array2DHashSet.java:188)
at org.antlr.v4.runtime.misc.Array2DHashSet.getOrAdd(Array2DHashSet.java:82)
at org.antlr.v4.runtime.atn.ATNConfigSet.add(ATNConfigSet.java:170)
at org.antlr.v4.runtime.atn.ATNConfigSet.add(ATNConfigSet.java:146)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:473)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:462)
at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:482)
at org.antlr.v4.runtime.atn.LexerATNSimulator.getReachableConfigSet(LexerATNSimulator.java:369)
at org.antlr.v4.runtime.atn.LexerATNSimulator.computeTargetState(LexerATNSimulator.java:304)
at org.antlr.v4.runtime.atn.LexerATNSimulator.execATN(LexerATNSimulator.java:231)
at org.antlr.v4.runtime.atn.LexerATNSimulator.match(LexerATNSimulator.java:141)
at org.antlr.v4.runtime.Lexer.nextToken(Lexer.java:165)
at org.antlr.v4.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:185)
at org.antlr.v4.runtime.BufferedTokenStream.sync(BufferedTokenStream.java:168)
at org.antlr.v4.runtime.BufferedTokenStream.nextTokenOnChannel(BufferedTokenStream.java:340)
at org.antlr.v4.runtime.CommonTokenStream.adjustSeekIndex(CommonTokenStream.java:94)
at org.antlr.v4.runtime.BufferedTokenStream.consume(BufferedTokenStream.java:153)
at org.antlr.v4.runtime.atn.ParserATNSimulator.execATN(ParserATNSimulator.java:556)
at org.antlr.v4.runtime.atn.ParserATNSimulator.adaptivePredict(ParserATNSimulator.java:412)
at com.sleekbyte.tailor.antlr.SwiftParser.pattern(SwiftParser.java:10329)
at com.sleekbyte.tailor.antlr.SwiftParser.patternInitializer(SwiftParser.java:5034)
at com.sleekbyte.tailor.antlr.SwiftParser.patternInitializerList(SwiftParser.java:4976)
Lastly, note that this issue exists in 0.7.0, but does not exist in v0.5.0.
Sorry that I can't be more precise. Hope this helps.
Reactions are currently unavailable