From a99b33314fc22d50f23f5eafe64161bcb7d023f2 Mon Sep 17 00:00:00 2001 From: Lily Lin Date: Thu, 11 Aug 2022 11:02:19 -0700 Subject: [PATCH] Backreferences do not guarantee forward progress --- Sources/_StringProcessing/ByteCodeGen.swift | 2 ++ Tests/RegexTests/MatchTests.swift | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Sources/_StringProcessing/ByteCodeGen.swift b/Sources/_StringProcessing/ByteCodeGen.swift index 66fefc49e..44eb75402 100644 --- a/Sources/_StringProcessing/ByteCodeGen.swift +++ b/Sources/_StringProcessing/ByteCodeGen.swift @@ -1019,6 +1019,8 @@ extension DSLTree.Node { case .atom(let atom): switch atom { case .changeMatchingOptions, .assertion: return false + // Captures may be nil so backreferences may be zero length matches + case .backreference: return false default: return true } case .trivia, .empty: diff --git a/Tests/RegexTests/MatchTests.swift b/Tests/RegexTests/MatchTests.swift index 794e57b16..66e7a3791 100644 --- a/Tests/RegexTests/MatchTests.swift +++ b/Tests/RegexTests/MatchTests.swift @@ -2549,4 +2549,8 @@ extension RegexTests { expectProgram(for: "a{\(maxStorable-1),\(maxStorable*2)}", doesNotContain: [.quantify]) expectProgram(for: "a{\(maxStorable),\(maxStorable*2+1)}", doesNotContain: [.quantify]) } + + func testFuzzerArtifacts() throws { + expectCompletion(regex: #"(b?)\1*"#, in: "a") + } }