Skip to content

Some string interpolation combinations can cause hang / OutOfMemoryError #356

@chadmoone

Description

@chadmoone

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)"  // works

Example 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.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions