Json.cs: Catastrophic regex backtracking in Regex_String causes extreme slowdown with JSON arrays
还没有人认领这个 Issue。
评估
调研方向
打开 ColorCode.Core/Compilation/Languages/Json.cs,检查 Regex_String 模式以及 issue 中描述的键匹配规则。使用包含字符串值的 JSON 数组重现变慢现象,将匹配空字符串的重复结构替换为指定的 unrolled-loop 模式,并验证示例能够及时着色,同时不改变预期的 JSON scopes。
由索引模型根据 Issue 内容生成。
描述
Description
The JSON language definition in the underlying ColorCode-Universal dependency (ColorCode.Core/Compilation/Languages/Json.cs) contains a catastrophic backtracking bug in its Regex_String pattern. This causes exponential processing time (O(2^n)) when colorizing JSON that contains arrays with string values, making the application appear completely frozen.
The pattern is:
"[^"\\]*(?:\\[^\r\n]|[^"\\]*)*"
The repeating group (?:\\[^\r\n]|[^"\\]*) has two alternatives:
\\[^\r\n]— backslash escape, always consumes 2 characters ✓[^"\\]*— can match an empty string ✗
The key-matching rule [,{]\s*("...")\s*: attempts to match JSON keys (string followed by :). For every , inside a JSON array, the engine tries this rule, matches the string value (e.g. "John Doe"), but fails when no : follows. On failure, the engine backtracks into the string subpattern and tries all possible ways to partition the n non-special characters between the outer [^"\\]* and the inner (?:[^"\\]*) repetition — resulting in O(2^n) backtracking states. For a 16-character string value this is ~65,000 states; for longer strings the number grows exponentially.
The fix is to replace the pattern with Friedl's Unrolled Loop:
"[^"\\]*(?:\\.[^"\\]*)*"
Each iteration of the group now must consume at least 2 characters via \\., eliminating the empty alternative and all backtracking.
Expected Behaviour
JSON arrays with string values are colorized in milliseconds, identical to simple JSON objects without arrays.
Actual Behaviour
Colorizing JSON containing arrays with string values causes extreme slowdown. Processing time grows exponentially with the length of string values inside arrays. Simple JSON objects (no arrays) are not affected.
Affected Version
3.0.1
Steps to Reproduce
- Set up a Markdig pipeline with
UseColorCode() - Call
Markdig.Markdown.ToHtml()on a Markdown document containing the following fenced code block:
```json
{
"Project": "My Project",
"Tags": [
"first long string value",
"another long string value"
]
}
```
- Observe that processing takes several seconds (or longer) instead of being near-instantaneous
- Note that removing the array (keeping only simple key-value pairs) restores normal performance
Workaround (until the underlying bug is fixed in ColorCode-Universal): pass a corrected JSON language definition via additionalLanguages:
var pipeline = new MarkdownPipelineBuilder()
.UseAdvancedExtensions()
.UseColorCode(additionalLanguages: new[] { new JsonLanguageFixed() })
.Build();
// Friedl's Unrolled Loop – no backtracking, correct escape handling
private sealed class JsonLanguageFixed : ILanguage
{
private const string RegexString = @"""[^""\\]*(?:\\.[^""\\]*)*""";
private const string RegexNumber = @"-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?";
public string Id => LanguageId.Json;
public string Name => "JSON";
public string CssClassName => "json";
public string FirstLinePattern => null;
public IList<LanguageRule> Rules => new List<LanguageRule>
{
new LanguageRule($@"[,\{{]\s*({RegexString})\s*:", new Dictionary<int, string> { { 1, ScopeName.JsonKey } }),
new LanguageRule(RegexString, new Dictionary<int, string> { { 0, ScopeName.JsonString } }),
new LanguageRule(RegexNumber, new Dictionary<int, string> { { 0, ScopeName.JsonNumber } }),
new LanguageRule(@"\b(true|false|null)\b", new Dictionary<int, string> { { 1, ScopeName.JsonConst } }),
};
public bool HasAlias(string lang) => false;
}
Checklist
- I have read the contributing guidelines
- I have verified this does not duplicate an existing issue
- 主要语言
- C#
- 星标
- 267
- 派生
- 58
- PR 合并指标
- 30 天内没有已合并 PR
贡献指南
这个仓库没有索引到贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
CommunityToolkit/ColorCode-Universal 的其他 Issue
-
难度 5/5 一周以上 新手友好度 20/100
-
难度 3/5 1-2 天 新手友好度 30/100
-
难度 3/5 1-2 天 新手友好度 38/100
-
难度 3/5 1-2 天 新手友好度 38/100
-
难度 4/5 3-5 天 新手友好度 35/100
CommunityToolkit/ColorCode-Universal#36 · 6 条评论 ·
查看 CommunityToolkit/ColorCode-Universal 的全部 Issue
相似的 Issue
-
type/automation type/tech-debt
难度 2/5 1-3 小时 新手友好度 78/100
-
bug
难度 2/5 1-3 小时 新手友好度 88/100
-
t/bug
难度 2/5 1-3 小时 新手友好度 82/100
-
ci-failure-cause test-failure
难度 2/5 1-3 小时 新手友好度 82/100
-
area:auth FE mvp P3
难度 2/5 1-3 小时 新手友好度 88/100
klasolsson81/jobbliggaren#1788 ·