What's left
Everything known not to match, each with a minimised reproducer, C's output and the port's. In the port means the port should change. Upstream C behaviour means C's output comes from undefined behaviour, a crash path or nondeterminism, so it cannot or should not be reproduced byte for byte; the port should still behave sensibly there.
| Severity | dot | neato | fdp | sfdp | twopi | all | Total |
|---|---|---|---|---|---|---|---|
| high | · | 2 | · | · | · | · | 2 |
| medium | 1 | · | 1 | 1 | 1 | 2 | 6 |
| low | · | 2 | · | 1 | · | 3 | 6 |
In the port 3
- mediumLinux/WASM: portable libm differs from Apple's pow/sin/cos/atan2 (2470/2589 e2e)GitHub issue
all· platform · 119 cases · won't fix - lowneato splines=polyline: route to a compass port on the node boundary ends 0.1pt off from C's for some node widthsGitHub issue
neato· splines · 0 cases - lowstderr: C warnings the port does not print (unknown port, HTML attributes, unplaced labels, rankset/cluster, ortho labels, touching nodes, multispline failures, printpath dump)GitHub issue
all· error-path · 0 cases
Upstream C behaviour 11
- highneato mode=KK model=circuit: C indexes the conductance matrix by AGSEQ (1-based) and crashesGitHub issue
neato· layout · 1 case · won't fix - highneato mode=ipsep with a node in two clusters: C underflows ntoplevel and aborts on a SIZE_MAX allocation; the port draws the graphGitHub issue
neato· error-path · 1 case · won't fix - mediumdot (upstream C): sametail/samehead on a record node can put the merged port outside every field, and C then routes from uninitialised path-end boxesGitHub issue
dot· splines · 2 cases · won't fix - mediumfdp (C): cluster layouts depend on heap addresses and vary run to runGitHub issue
fdp· layout · 3 cases · won't fix - mediumneato-family multispline router: ties in the triangle shortest path are broken by GTS's pointer-hash face orderGitHub issue
sfdp· splines · 3 cases · won't fix - mediumtwopi: edge routes on the arrows graphs change from run to run in C (floating-point tie)GitHub issue
twopi· splines · 8 cases · won't fix - mediumpack: C's fillEdge reads past a one-point spline, so polyomino packing of components depends on garbage memoryGitHub issue
all· layout · 2 cases · won't fix - lowneato/fdp/sfdp: unseeded start=random (and fdp start=regular) is seeded from the clock in C; the port uses a fixed seedGitHub issue
neato· layout · 11 cases · won't fix - lowsfdp smoothing=rng: C's output changes from run to run (port matches one of C's outputs)GitHub issue
sfdp· layout · 1 case · won't fix - low-Txdot: C prints its own string constants for HTML cells with STYLE="dashed" (out-of-bounds read in xdot_style)GitHub issue
all· render · 0 cases · won't fix - low-Tplain: C prints freed memory for Latin-1/entity-converted labels (use-after-free in canon)GitHub issue
all· render · 10 cases · won't fix
In numbers
- 119 corpus files under portable math (Linux, WASM). Apple's libm is closed source; see the issue, Math off macOS and the file list.
- 7 twopi layouts: C routes the arrows graphs differently from run to run (issue).
- 1.2% of the last fuzzing round: every remaining case belongs to one of the issues above; the round-by-round record is in the fuzzing notes.
- stderr: exit status matches, and so does the wording of DOT syntax errors; some warning texts do not, and a few malformed inputs are rejected at a different token (warnings).