ntherning
04/20/2021, 8:46 AMimport kotlin.test.Test
import kotlin.test.assertEquals
class Test {
@Test
fun stackOverflowOnRegexReplace() {
val regex = Regex("[a]+")
val input = "a".repeat(10_000)
val output = regex.replace(input, "")
assertEquals("", output)
}
}
The reason is a stack overflow. There is too much recursion in the Regex classes on Kotlin Native, see the condensed call stack below. The crash happens when the input string is about 6300 characters long. On my iPhone 12 it happens much earlier, the input only has to be about 620 characters. I guess it depends on the target arch, optimizations, etc, how deep the call stack is before the crash happens.
Is this a known issue? Or should I report it?
clock_gettime 0x00007fff20081334
std::__1::chrono::steady_clock::now() 0x00007fff202a0d72
konan::getTimeMicros() 0x000000010d2496d9
(anonymous namespace)::garbageCollect(MemoryState*, bool) 0x000000010d213acc
ObjHeader* (anonymous namespace)::allocInstance<true>(TypeInfo const*, ObjHeader**) 0x000000010d21f9aa
kotlin.native.BitSet.<get-asBitCoordinates>#internal BitSet.kt:61
BitSet#get BitSet.kt:344
kotlin.text.regex.CharClass.object-18.contains#internal CharClass.kt:497
AbstractCharClass#contains AbstractCharClass.kt:68
SupplementaryRangeSet#contains SupplementaryRangeSet.kt:127
SupplementaryRangeSet#matches SupplementaryRangeSet.kt:108
GroupQuantifierSet#matches GroupQuantifierSet.kt:75
SupplementaryRangeSet#matches SupplementaryRangeSet.kt:109
GroupQuantifierSet#matches GroupQuantifierSet.kt:75
SupplementaryRangeSet#matches SupplementaryRangeSet.kt:109
GroupQuantifierSet#matches GroupQuantifierSet.kt:75
... (about 10000 repeating lines)
SupplementaryRangeSet#matches SupplementaryRangeSet.kt:109
GroupQuantifierSet#matches GroupQuantifierSet.kt:75
SupplementaryRangeSet#matches SupplementaryRangeSet.kt:109
GroupQuantifierSet#matches GroupQuantifierSet.kt:75
SupplementaryRangeSet#matches SupplementaryRangeSet.kt:109
GroupQuantifierSet#matches GroupQuantifierSet.kt:75
AbstractSet#find AbstractSet.kt:95
AbstractSet#find _Collections.kt:256
AbstractSet#find AbstractSet.kt:95
SingleSet#find SingleSet.kt:46
Regex#find Regex.kt:167
Regex#find$default Regex.kt:160
Regex#replace Regex.kt:242
Regex#replace Regex.kt:234
Test#stackOverflowOnRegexReplace Test.kt:9
$Test$test$0.$stackOverflowOnRegexReplace$FUNCTION_REFERENCE$72.invoke#internal Test.kt:6
$<bridge-UNNN>invoke Test.kt:6
TestCase#run TestSuite.kt:85
kotlin.native.internal.test.TestRunner.run#internal TestRunner.kt:241
kotlin.native.internal.test.TestRunner.run#internal _Collections.kt:1819
kotlin.native.internal.test.TestRunner.run#internal TestRunner.kt:234
kotlin.native.internal.test.TestRunner.runIteration#internal TestRunner.kt:265
kotlin.native.internal.test.TestRunner.runIteration#internal Timing.kt:32
kotlin.native.internal.test.TestRunner.runIteration#internal TestRunner.kt:265
kotlin.native.internal.test.TestRunner.runIteration#internal _Collections.kt:1819
kotlin.native.internal.test.TestRunner.runIteration#internal TestRunner.kt:258
kotlin.native.internal.test.TestRunner.runIteration#internal Timing.kt:32
kotlin.native.internal.test.TestRunner.runIteration#internal TestRunner.kt:257
TestRunner#run TestRunner.kt:280
TestRunner#run Timing.kt:32
TestRunner#run TestRunner.kt:277
test#testLauncherEntryPoint Launcher.kt:22
test#main Launcher.kt:26
Konan_start Launcher.kt:25
Init_and_run_start 0x000000010d08836b
start 0x00007fff2025a3e9
start 0x00007fff2025a3e9
Artyom Degtyarev [JB]
04/20/2021, 10:49 AMntherning
04/20/2021, 11:05 AM