fold/bench/gold/_generate_poj104.py
trvon 3f1234f7bb
fold: bounded symbolic SAST for C++
Clang LibTooling + Z3 BV-64 encoding.
11 detectors: clone, equiv, class-dup, dead, null-deref,
div-by-zero, int-overflow, oob, int-truncation,
sign-conversion, taint-track.

Interfaces: CLI, MCP (JSON-RPC 2.0), LSP.
Output: SARIF 2.1.0, JSON, Markdown.
2026-05-14 23:14:54 -04:00

58 lines
2.2 KiB
Python
Executable file

#!/usr/bin/env python3
"""Generate bench/gold/poj-104.json from the fetched POJ-104 directory tree.
POJ-104's gold standard is structural: every pair of submissions inside the
same numbered folder solves the same algorithm and is therefore Type-4
equivalent. We materialize this as one gold entry per folder, with `files`
listing every submission's basename in that folder.
The scorer in bench/score.py treats a fold finding as covering a gold
entry if the finding's `kind` is `equiv` (or matches `kind` prefix) and
the finding's location files are a superset of the gold entry's files.
This is generous for fold (it doesn't need to find all C(n,2) pairs — one
proof per cluster is enough) which matches Zubkov 2022's clustering
evaluation methodology.
"""
from __future__ import annotations
import json
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent / "corpora" / "poj-104" / "dataset"
OUT = Path(__file__).resolve().parent / "poj-104.json"
def main() -> int:
if not ROOT.is_dir():
print(f"dataset not found at {ROOT}; run bench/corpora/poj-104/fetch.sh",
file=sys.stderr)
return 2
expected = []
for algo_dir in sorted(ROOT.iterdir()):
if not algo_dir.is_dir():
continue
cpps = sorted(p.name for p in algo_dir.glob("*.cpp"))
if len(cpps) < 2:
continue
# Gold entry: at least one cross-pair from this algorithm folder
# must be reported by the tool as equiv.
expected.append({
"kind": "equiv",
"files": [str(algo_dir.name + "/" + p) for p in cpps[:2]],
"id": f"poj-104-algo-{algo_dir.name}",
"description": f"Algorithm {algo_dir.name} cluster (~{len(cpps)} submissions)",
})
OUT.write_text(json.dumps({
"name": "poj-104",
"description": "POJ-104 C++ clone-detection benchmark. "
"Each gold entry is 'at least one cross-pair within "
"an algorithm folder must be flagged equivalent'.",
"expected": expected,
}, indent=2))
print(f"wrote {len(expected)} gold entries → {OUT}")
return 0
if __name__ == "__main__":
raise SystemExit(main())