#2187 fixed the six t27c gen-* calls in verify_igla_race.py. An AST re-scan shows the repair was partial — 12 sites remained, in two classes:
1. t27c gen-* with a different call shape (3 sites) — verify_multitarget.py, verify_trainer_c.py. The previous regex only matched the single-line form, so these were silently skipped.
2. Running the built binary (8 sites) — cb, rb, peb, perb, cbin, rbin, b. subprocess.run([...]).stdout with no exit-code check means a crash arrives as a short or empty result list, which then surfaces as a NUMERIC MISMATCH between targets. That is the most alarming reading available and the wrong one: a program that died on signal 11 did not disagree about arithmetic.
Fix: _run_bin(cmd, what) alongside the existing _build and _gen, reporting the exit code and the signal number when negative. All ten _gen/_run_bin call sites now guard None so a failure ends cleanly instead of raising TypeError on None.split().
Verified by planting a fault, not by reading:
before: FAIL: C backend failed to build/run
after: C target: cc exited 1
mod.h:18:34: error: use of undeclared identifier 'hm'
18 | static const int32_t hs = (512 + hm);
All three tools still exit 0 on a clean tree.
Remaining, deliberately: check_withdrawn_live.py:80 (git ls-files, already has a try/except fallback) and verify_emit_bitexact.py:127 (vvp) — the latter is worth a follow-up.
Self-critical: this is the second partial repair in a row. #2187's regex matched one call shape and I reported the pattern as fixed without re-scanning. The AST scan is now the check, and it runs before the claim.
Refs #2187, #2185
#2187 fixed the six
t27c gen-*calls inverify_igla_race.py. An AST re-scan shows the repair was partial — 12 sites remained, in two classes:1.
t27c gen-*with a different call shape (3 sites) —verify_multitarget.py,verify_trainer_c.py. The previous regex only matched the single-line form, so these were silently skipped.2. Running the built binary (8 sites) —
cb,rb,peb,perb,cbin,rbin,b.subprocess.run([...]).stdoutwith no exit-code check means a crash arrives as a short or empty result list, which then surfaces as a NUMERIC MISMATCH between targets. That is the most alarming reading available and the wrong one: a program that died on signal 11 did not disagree about arithmetic.Fix:
_run_bin(cmd, what)alongside the existing_buildand_gen, reporting the exit code and the signal number when negative. All ten_gen/_run_bincall sites now guardNoneso a failure ends cleanly instead of raisingTypeErroronNone.split().Verified by planting a fault, not by reading:
All three tools still exit 0 on a clean tree.
Remaining, deliberately:
check_withdrawn_live.py:80(git ls-files, already has a try/except fallback) andverify_emit_bitexact.py:127(vvp) — the latter is worth a follow-up.Self-critical: this is the second partial repair in a row. #2187's regex matched one call shape and I reported the pattern as fixed without re-scanning. The AST scan is now the check, and it runs before the claim.
Refs #2187, #2185