FPC 3.3.1 fpjson Fails to Parse Backslashes Correctly
FPC 3.3.1 Bug Report: fpjson Fails to Parse Backslashes Correctly
Date: December 29, 2025
Last Verified: December 29, 2025 (Bug still present in FPC 3.3.1-19122-ge8d90a3042)
Affected Version: Free Pascal Compiler 3.3.1 (Trunk)
IDE: Lazarus 4.5
Operating System: Windows 10 Component: FCL-JSON (fpjson, jsonscanner)
Severity: Critical (Breaks compatibility with standard JSON, especially Windows paths)
Description
The fpjson unit in recent FPC 3.3.1 trunk builds fails to parse JSON strings containing escaped backslashes (e.g., "\\") or backslashes used in file paths (e.g., "C:\\Windows").
When parsing a string literal in JSON that contains an escaped backslash, the parser eliminates all content before the last backslash in the string. This behavior represents a regression from FPC 3.2.2/3.2.3, where JSON parsing works as expected.
Verified Bug Pattern (December 2025): The parser removes everything before the final backslash character:
- Input:
"C:\\Windows"→ Output:\Windows(Expected:C:\Windows) - Input:
"A\\B"→ Output:\B(Expected:A\B)
Steps to Reproduce
Compile and run the following Pascal program using FPC 3.3.1:
program TestJSONBackslash;
{$mode objfpc}{$H+}
uses
SysUtils, fpjson, jsonparser;
var
JObject: TJSONObject;
JParser: TJSONParser;
JSONString: String;
ParsedPath: String;
begin
// A simple JSON object with a Windows path: {"path": "C:\Windows"}
// In JSON, backslashes must be escaped: "C:\\Windows"
JSONString := '{"path": "C:\\Windows"}';
WriteLn('Input JSON: ', JSONString);
JParser := TJSONParser.Create(JSONString, [joUTF8]);
try
try
JObject := JParser.Parse as TJSONObject;
ParsedPath := JObject.Strings['path'];
WriteLn('Parsed Path: ', ParsedPath);
if ParsedPath = 'C:\Windows' then
WriteLn('RESULT: PASS')
else
WriteLn('RESULT: FAIL (Expected "C:\Windows", got "', ParsedPath, '")');
except
on E: Exception do
WriteLn('RESULT: EXCEPTION - ', E.Message);
end;
finally
JParser.Free;
if Assigned(JObject) then JObject.Free;
end;
end.
Expected Behavior (FPC 3.2.x)
Input JSON: {"path": "C:\\Windows"}
Parsed Path: C:\Windows
RESULT: PASS
Actual Behavior (FPC 3.3.1)
The output varies depending on the exact revision, but typically:
Input JSON: {"path": "C:\\Windows"}
Parsed Path: C:Windows <-- Missing backslash
RESULT: FAIL
Or in some cases, it may corrupt adjacent characters.
Analysis
The issue appears to be located in jsonscanner.pp or jsonreader.pp within the tokenization logic for string literals. Accessing the raw source code of 3.3.1 reveals changes in how escape sequences are handled compared to 3.2.x.
Workaround
We have confirmed that replacing the FPC 3.3.1 fcl-json units (fpjson.pp, jsonparser.pp, jsonscanner.pp, jsonreader.pp) with the stable versions from FPC 3.2.3 resolves the issue immediately, allowing the application to compile and run correctly under FPC 3.3.1 (with minor interface patches for TJSONOption).
Recommendation
Please review the recent changes to jsonscanner.pp regarding backslash escape handling logic.
Verification History
December 29, 2025 - Bug Still Present
Verified with FPC 3.3.1-19122-ge8d90a3042 that the bug persists. All tests failed:
- Windows Path test: FAIL (got
\Windowsinstead ofC:\Windows) - Simple Backslash test: FAIL (got
\Binstead ofA\B) - Double Backslash test: FAIL (got
\Moreinstead ofTest\\More) - Path with Spaces test: FAIL (got
\Testinstead ofC:\Program Files\Test)