Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
281 commits
Select commit Hold shift + click to select a range
914d7ba
fix: fall back to plain compile when crabllvm is not built
GuilhermeBn198 Aug 12, 2026
3d77b84
chore: track juliet test suite as submodule + update baseline spec
GuilhermeBn198 Aug 12, 2026
f4a3685
feat(castle): make evaluation script resumable (skip done ids in CSV)
GuilhermeBn198 Aug 12, 2026
ea9669c
fix: pass -m2c-entry-function only when MemoryTrackPass is loaded
GuilhermeBn198 Aug 12, 2026
26d9a85
fix(castle/juliet): classify infra failures as ERROR, not TIMEOUT
GuilhermeBn198 Aug 12, 2026
6f26afb
test: add regression for non-memtrack modes (overflow/assert/target)
GuilhermeBn198 Aug 13, 2026
e2fc709
fix(memtrack): use full-width address in find_row_with_address
GuilhermeBn198 Aug 13, 2026
ebd9c50
fix(assert): instrument libc __assert_fail in AssertPass
GuilhermeBn198 Aug 13, 2026
ddb4c24
fix(castle): correct CWE→mode mapping and violation-line extraction
GuilhermeBn198 Aug 13, 2026
ed1b39c
docs: add findings report for CASTLE/Juliet baseline PR
GuilhermeBn198 Aug 13, 2026
db77df0
feat(castle): allow RESULTS_DIR override for re-run with fixed build
GuilhermeBn198 Aug 13, 2026
2cd1042
fix(overflow): align pass/runtime binop signatures and check before t…
GuilhermeBn198 Aug 13, 2026
c09378d
feat(overflow): detect division by zero as FALSE-DIVBYZERO
GuilhermeBn198 Aug 13, 2026
bd237e1
docs: update findings report with div-by-zero and overflow-signature …
GuilhermeBn198 Aug 13, 2026
61f9525
fix(overflow): make the binop checks width-aware over a 64-bit ABI
GuilhermeBn198 Aug 13, 2026
f1b7145
feat(juliet): cover CWE-191/369 and allow per-CWE sampling
GuilhermeBn198 Aug 13, 2026
19c2024
fix(eval): stop reading the fuzzer handover as a timeout
GuilhermeBn198 Aug 13, 2026
06f4985
fix(klee): escalate to SIGKILL when a backend overruns its slice
GuilhermeBn198 Aug 16, 2026
041bb61
fix(eval): capture backend output to a file and reap orphaned processes
GuilhermeBn198 Aug 16, 2026
cfbf900
feat(juliet): model rand()/srand() as nondeterministic over [0, RAND_…
GuilhermeBn198 Aug 16, 2026
50f8dd9
feat(juliet): stratify sampling by test family instead of by filename…
GuilhermeBn198 Aug 16, 2026
f7175c3
feat(eval): add a storage watchdog for unattended baseline runs
GuilhermeBn198 Aug 16, 2026
b93cc54
docs: add the v5 baseline report and the defect-reduction plan
GuilhermeBn198 Aug 16, 2026
045c97f
refactor: move the Juliet harness to tests/juliet/ and untrack test-c…
GuilhermeBn198 Aug 16, 2026
8606a7e
docs: plan Test-Comp conformance and review the Crab-LLVM dependency
GuilhermeBn198 Aug 16, 2026
82e8161
docs: plan the --add-invariants revival via Clam dev16
GuilhermeBn198 Aug 16, 2026
bad55b8
docs(plans): fix the installed binary path and declare v5 comparability
GuilhermeBn198 Aug 16, 2026
1a8c6a3
fix(invariants): refuse --add-invariants instead of ignoring it
GuilhermeBn198 Aug 16, 2026
6f806fe
feat(invariants): bring --add-invariants back on Clam dev16
GuilhermeBn198 Aug 16, 2026
231ce71
feat(test-comp): emit a Test-Comp test suite, and fix the three bugs …
GuilhermeBn198 Aug 16, 2026
8a4de91
chore: ignore the unit-test build tree
GuilhermeBn198 Aug 16, 2026
11934bb
ci: gate on TestCov reproducing the emitted test suites
GuilhermeBn198 Aug 16, 2026
ea10a2b
docs(testcomp): record the falsifiability check, and what it exposed
GuilhermeBn198 Aug 16, 2026
9da09d4
ci: fire on feat/** branches, for pushes and for stacked PRs
GuilhermeBn198 Aug 16, 2026
d37521a
ci: cover feature branches via pull_request only, not also via push
GuilhermeBn198 Aug 16, 2026
80383b5
fix(testcomp): keep the KEEP_WORK notice off stdout
GuilhermeBn198 Aug 16, 2026
3be786c
docs: investigate finding K, and add a progress checklist
GuilhermeBn198 Aug 16, 2026
c4ef3a3
fix(verdict): keep a violation that was found before the budget expired
GuilhermeBn198 Aug 17, 2026
350ddbb
Merge pull request #55 from hbgit/feat/castle-juliet-baseline
hbgit Aug 17, 2026
6eecbda
Merge pull request #56 from hbgit/feat/testcomp-conformance
hbgit Aug 17, 2026
49954ad
Merge pull request #57 from hbgit/feat/castle-juliet-baseline
GuilhermeBn198 Aug 22, 2026
247e577
fix(docker): build Clam with clang-16, and gate Dockerfile.dev on PRs
GuilhermeBn198 Aug 22, 2026
1c46d9f
Merge pull request #58 from hbgit/fix/clam-image-build
GuilhermeBn198 Aug 22, 2026
b35e536
chore(docker): pin Clam and its three dependencies to SHAs
GuilhermeBn198 Aug 22, 2026
05a5535
Merge pull request #59 from hbgit/chore/pin-clam-shas
GuilhermeBn198 Aug 22, 2026
3526ae5
fix(reachability): announce a target that is never called (finding B)
GuilhermeBn198 Aug 22, 2026
e1438e5
Merge pull request #60 from hbgit/fix/target-coverage-warning
GuilhermeBn198 Aug 22, 2026
69329c2
feat(testcomp): BenchExec packaging, and always emit a test suite (H1.4)
GuilhermeBn198 Aug 22, 2026
705417a
fix(nondet-log): unsigned rows carried a duplicated value column
GuilhermeBn198 Aug 22, 2026
bb64de7
Merge pull request #61 from hbgit/feat/testcomp-benchexec-packaging
GuilhermeBn198 Aug 22, 2026
35233a1
Merge pull request #62 from hbgit/fix/nondet-log-unsigned-row
GuilhermeBn198 Aug 22, 2026
087cc9e
fix(klee): name symbolic objects by their type, not by unexpanded mac…
GuilhermeBn198 Aug 22, 2026
6e1288e
feat(testcomp): Cover-Branches suites from KLEE's own path vectors
GuilhermeBn198 Aug 22, 2026
376e31b
fix(testcomp): stop labelling TestCov's Result line as a coverage claim
GuilhermeBn198 Aug 22, 2026
d6da0e9
docs(testcomp): record how to read the 2026-08-22 corpus results
GuilhermeBn198 Aug 22, 2026
381aeae
docs: H1.3 and H2.5 done — Cover-Branches lands via KLEE's ktest output
GuilhermeBn198 Aug 22, 2026
67b8378
fix(testcomp): nested sampling and a category-interleaved manifest; q…
GuilhermeBn198 Aug 22, 2026
2ed743b
fix(testcomp): six defects the corpus caught, and the tests that catc…
GuilhermeBn198 Aug 23, 2026
5bbf328
fix(frontend): propagate the analysis exit code; --expected-result re…
GuilhermeBn198 Aug 23, 2026
3bc2ca2
fix(castle): stop mapping unsupported CWEs to the degenerate reachabi…
GuilhermeBn198 Aug 23, 2026
9cfca0f
fix(verdict): an assumption is not a violation, and an empty verdict …
GuilhermeBn198 Aug 23, 2026
1f76c70
test(v9): quota-40 manifests and the predictions, recorded before the…
GuilhermeBn198 Aug 23, 2026
835f618
fix(testcomp): recover the vector even when the runtime recorded nothing
GuilhermeBn198 Aug 23, 2026
24e81e3
fix(fuzzer): read a whole type's worth of bytes, and say when the run…
GuilhermeBn198 Aug 23, 2026
f8b9dc8
test(testcomp): measure the hybrid, which is what the tool actually runs
GuilhermeBn198 Aug 23, 2026
ca7af4f
feat(hybrid): let the two engines hand each other input vectors
GuilhermeBn198 Aug 23, 2026
060f452
feat(slicing): slice the program with respect to the target before an…
GuilhermeBn198 Aug 23, 2026
a68c33b
Merge pull request #63 from hbgit/fix/klee-symbolic-object-names
GuilhermeBn198 Aug 23, 2026
8a6fa50
test(testcomp): chain the v11 measurement behind the v10 campaign and…
GuilhermeBn198 Aug 23, 2026
75f2a0a
test(testcomp): make v11 a 2x2 factorial with its own control
GuilhermeBn198 Aug 24, 2026
120b986
Merge pull request #64 from hbgit/feat/cover-branches
GuilhermeBn198 Aug 24, 2026
ce26f01
fix(assume): the XCSP family spells it "assume", and spelling was the…
GuilhermeBn198 Aug 24, 2026
57a0d12
fix(slice): give the criterion function back its body before linking
GuilhermeBn198 Aug 24, 2026
621db93
fix(verdict): do not report FAILED for a violation nothing can reproduce
GuilhermeBn198 Aug 24, 2026
8472427
test: chain the v12 regression sweep and the v13 guard measurement
GuilhermeBn198 Aug 24, 2026
a377611
fix(budget): always reach a verdict, and always flush it
GuilhermeBn198 Aug 24, 2026
43f245a
test: point the chained measurement at v14
GuilhermeBn198 Aug 24, 2026
336dc06
fix(slice): bound the slicer too
GuilhermeBn198 Aug 24, 2026
b81780f
test: run v14 at the competition budget, with CASTLE and Juliet besid…
GuilhermeBn198 Aug 24, 2026
241adb2
test: build the v14 paper run -- 4939 tasks at the competition budget
GuilhermeBn198 Aug 24, 2026
bf77658
test: 72h deadline, and six shards for the half that needs them
GuilhermeBn198 Aug 24, 2026
e9129dd
fix(klee): --max-time takes integer seconds, and a fraction kills the…
GuilhermeBn198 Aug 25, 2026
fae19a0
test: relaunch the paper run on v15, gated behind its own validation
GuilhermeBn198 Aug 25, 2026
3c24375
docs(v15): the paper run's report, and stop versioning campaign results
GuilhermeBn198 Aug 27, 2026
475454b
chore: campaign results out of the repository
GuilhermeBn198 Aug 27, 2026
54cb6d5
fix: address timeout and fuzzer review feedback
Copilot Sep 1, 2026
fa285b1
fix: preserve timeout budget headroom
Copilot Sep 1, 2026
6d044eb
fix: report fuzzer availability errors
Copilot Sep 1, 2026
4150327
Merge pull request #65 from hbgit/fix/slice-target-stub
hbgit Sep 1, 2026
b72835b
docs(tacasv1): design spec — replace LibFuzzer with AFL++
GuilhermeBn198 Sep 26, 2026
e98397d
docs(tacasv1): implementation plan — LibFuzzer to AFL++
GuilhermeBn198 Sep 26, 2026
fdd1fb4
feat(tacasv1): install AFL++ 4.40c (PCGUARD) in the dev image
GuilhermeBn198 Sep 26, 2026
0031130
feat(tacasv1): resolve afl-clang-fast/afl-fuzz paths
GuilhermeBn198 Sep 26, 2026
1455be8
feat(tacasv1): replace FindLibFuzzer with FindAFLPlusPlus
GuilhermeBn198 Sep 26, 2026
208c6dc
feat(tacasv1): AFL++ persistent nondet generator
GuilhermeBn198 Sep 26, 2026
d9ab6d0
feat(tacasv1): drive AFL++ from the Caller
GuilhermeBn198 Sep 26, 2026
c18cd77
feat(tacasv1): --nondet-generator afl replaces fuzzer
GuilhermeBn198 Sep 26, 2026
abae549
chore(tacasv1): rename SKIP_LIB_FUZZER→SKIP_AFL_PLUS_PLUS and update …
GuilhermeBn198 Sep 26, 2026
87f9aaa
fix(tacasv1): make the AFL++ arm build and confirm violations
GuilhermeBn198 Sep 26, 2026
d089c90
fix(tacasv1): address the review of the AFL++ fix commit
GuilhermeBn198 Sep 26, 2026
1a49aa5
feat(tacasv1): CmpLog companion binary, and rewind the AFL++ read index
GuilhermeBn198 Sep 26, 2026
a6068c6
fix(tacasv1): bound afl-fuzz by timeout alone, not also by -V
GuilhermeBn198 Sep 26, 2026
6c7b0f2
fix(verdict): an empty vector is a witness when the program reads no …
GuilhermeBn198 Sep 26, 2026
a12ac9b
docs(tacasv2a): design spec — slicing for reach/assert that keeps the…
GuilhermeBn198 Sep 27, 2026
83ec67c
docs(tacasv2a): implementation plan
GuilhermeBn198 Sep 27, 2026
74ecf4a
feat(tacasv2a): pure slicing helpers -- criteria, stub, statistics
GuilhermeBn198 Sep 27, 2026
336a26d
fix(tacasv2a): slice without cutoff and keep every nondet read
GuilhermeBn198 Sep 27, 2026
c36a532
feat(tacasv2a): --slice in assert mode
GuilhermeBn198 Sep 27, 2026
75bdefd
docs(tacasv2a): diagnostic sample re-run on the implementation
GuilhermeBn198 Sep 27, 2026
ffad3e5
fix(tacasv2a): take the nondet names from the program as well
GuilhermeBn198 Sep 27, 2026
0b0e855
ci: run the PR gates on PRs stacked on tacas/** branches
GuilhermeBn198 Sep 27, 2026
8eb66b3
Revert "ci: run the PR gates on PRs stacked on tacas/** branches"
GuilhermeBn198 Sep 27, 2026
5a4e2fb
test(tacasv1): the evaluation runner's fuzzer arm is GENERATOR=afl
GuilhermeBn198 Sep 27, 2026
d182b20
Merge branch 'feat/tacas-aflpp' into feat/tacas-slicing
GuilhermeBn198 Sep 27, 2026
2d6bf1a
docs(tacas): experiment log -- one entry per mini-round (R1-R6)
GuilhermeBn198 Sep 27, 2026
bb0afa3
docs(tacasv2b): design spec — slicing for memtrack/memcleanup after i…
GuilhermeBn198 Sep 27, 2026
e8e244e
docs(tacasv2b): implementation plan
GuilhermeBn198 Sep 27, 2026
e4ac339
feat(tacasv2b): runtime names as slicing criteria
GuilhermeBn198 Sep 27, 2026
8864d7c
feat(tacasv2b): --slice for memtrack and memcleanup, after instrument…
GuilhermeBn198 Sep 27, 2026
9632286
test(tacasv2b): SV-COMP MemSafety evaluation harness
GuilhermeBn198 Sep 27, 2026
2cddf6b
test(tacasv2b): opt-in flags for the CASTLE and Juliet runners
GuilhermeBn198 Sep 27, 2026
e29e45d
docs(tacas): R7 -- overflow slicing probe
GuilhermeBn198 Sep 27, 2026
5836a44
docs(tacasv2c): study and draft spec -- slicing for overflow
GuilhermeBn198 Sep 27, 2026
7b9f0eb
docs(tacasv2c): implementation plan
GuilhermeBn198 Sep 27, 2026
4eb6ba4
feat(tacasv2c): --slice for overflow
GuilhermeBn198 Sep 27, 2026
31d3fc6
test(tacasv2c): NoOverflows harness
GuilhermeBn198 Sep 27, 2026
aa76cee
docs(tacas): R8-R9 -- memory slicing rounds, wrong TRUE found
GuilhermeBn198 Sep 27, 2026
96e078f
fix(tacasv2b): external calls are slicing criteria after instrumentation
GuilhermeBn198 Sep 27, 2026
4d4a4cf
Merge branch 'feat/tacas-slicing-mem' into feat/tacas-slicing-overflow
GuilhermeBn198 Sep 27, 2026
30f2215
fix(verdict): KLEE halting on its timer is a timeout, not a proof
GuilhermeBn198 Sep 27, 2026
3ec37a9
Merge branch 'feat/tacas-slicing-mem' into feat/tacas-slicing-overflow
GuilhermeBn198 Sep 27, 2026
e6b9296
docs(tacas): R9b-R13 and the two correctness defects they exposed
GuilhermeBn198 Sep 27, 2026
4d1954f
docs(tacas): sleep-3 is a pre-existing memtrack false positive, not s…
GuilhermeBn198 Sep 27, 2026
a9bfeff
fix(tacasv2b): intrinsics as criteria, refuse a slice without runtime…
GuilhermeBn198 Sep 28, 2026
c53b474
Merge branch 'feat/tacas-slicing-mem' into feat/tacas-slicing-overflow
GuilhermeBn198 Sep 28, 2026
69d8104
docs(tacas): R14 -- consolidated control x slice with both fixes
GuilhermeBn198 Sep 28, 2026
d8c0ec2
Merge branch 'feat/tacas-slicing-mem' into feat/tacas-slicing-overflow
GuilhermeBn198 Sep 28, 2026
f92095e
docs(tacas): R14b -- memory slice arm on the final build
GuilhermeBn198 Sep 28, 2026
fbbcb92
Merge branch 'feat/tacas-slicing-mem' into feat/tacas-slicing-overflow
GuilhermeBn198 Sep 28, 2026
df7dc9a
Merge pull request #68 from hbgit/feat/tacas-slicing
hbgit Sep 28, 2026
2376330
Merge pull request #70 from hbgit/feat/tacas-slicing-mem
hbgit Sep 28, 2026
f01e8c3
Merge pull request #71 from hbgit/feat/tacas-slicing-overflow
hbgit Sep 28, 2026
56d11d1
docs(tacasv3a): design spec -- smart seeds plumbing (AFL++ <-> KLEE)
GuilhermeBn198 Sep 29, 2026
1f68143
docs(tacasv3a): implementation plan
GuilhermeBn198 Sep 29, 2026
fb8248a
feat(tacasv3a): pure seed-store helpers
GuilhermeBn198 Sep 29, 2026
a560d1e
feat(tacasv3a): a seed store that survives the hybrid's phases
GuilhermeBn198 Sep 29, 2026
b662546
feat(tacasv3a): the fuzzer corpus reaches KLEE as typed seeds
GuilhermeBn198 Sep 29, 2026
3a89b46
fix(tacasv3a): bound and phase-gate the replays, clean store, keep pr…
GuilhermeBn198 Sep 29, 2026
3096644
docs(tacas): R15 -- Cover-Error sample, tacasv2 x v15
GuilhermeBn198 Sep 29, 2026
14c8506
docs(tacas): R15 -- Cover-Branches sample
GuilhermeBn198 Sep 29, 2026
1eb8a30
fix(verdict): the program's abort() prunes the path, it does not end …
GuilhermeBn198 Sep 29, 2026
3b156aa
docs(tacas): R18 partial and the 2026-09-29 handoff
GuilhermeBn198 Sep 29, 2026
4206581
docs(tacas): R18 -- the abort fix clears 6 of 8 wrong TRUEs
GuilhermeBn198 Sep 29, 2026
6fa1b24
docs(tacas): drop the stale R18 partial from the handoff
GuilhermeBn198 Sep 29, 2026
4c16013
fix(verdict): KLEE finishing after dropping paths is not a proof
GuilhermeBn198 Sep 29, 2026
0e6e015
docs(tacas): R16 -- the seed exchange covers 148 vs 129
GuilhermeBn198 Sep 29, 2026
7c6f892
fix(verdict): a path an assumption pruned is not a dropped path
GuilhermeBn198 Sep 29, 2026
09d8066
fix(verdict): a KLEE that died, or hit its memory cap, proved nothing
GuilhermeBn198 Sep 29, 2026
93e8de3
feat(slice): slice once per run, and experiment knobs for the slice
GuilhermeBn198 Sep 29, 2026
be6754d
fix(slice): bound the post-slice cleanup like the slicer
GuilhermeBn198 Sep 29, 2026
8cdcb07
perf(slice): scan the IR for names without std::regex
GuilhermeBn198 Sep 30, 2026
c3d2bbe
fix(afl): the fuzzer's input runs out as zeros, not as a replay of it…
GuilhermeBn198 Sep 29, 2026
4d1e91e
feat(hybrid): --alternate-engines, turns that end when an engine stag…
GuilhermeBn198 Sep 29, 2026
2e931ba
docs(schedule): phases 2 and 3 as the TACAS line delivered them
GuilhermeBn198 Sep 29, 2026
902eaf5
fix(hybrid): the review of --alternate-engines
GuilhermeBn198 Sep 29, 2026
e247b64
fix(hybrid): the fuzzer gets all of KLEE's vectors, built once, with …
GuilhermeBn198 Sep 29, 2026
ca996ba
fix(afl): one build budget for the three AFL++ binaries
GuilhermeBn198 Sep 30, 2026
956df7b
fix(memtrack): check memset/memcpy/memmove under LLVM 16's opaque poi…
GuilhermeBn198 Sep 29, 2026
8111145
docs(tacas): handoff after 2d, 3b and the review fixes
GuilhermeBn198 Sep 29, 2026
56e1cb9
fix(afl): a fuzzer binary that fails to link says so, and why
GuilhermeBn198 Sep 29, 2026
b664ae6
feat(seeds): the fuzzer entries that reached new edges go to KLEE first
GuilhermeBn198 Sep 29, 2026
9853308
docs(tacas): handoff -- 3c v1 and R20
GuilhermeBn198 Sep 29, 2026
6e7bfdd
docs(tacas): R16 -- Cover-Branches, the seed exchange 49.7% vs 47.7%
GuilhermeBn198 Sep 29, 2026
caf30b6
docs(tacas): R17 and a partial R19
GuilhermeBn198 Sep 29, 2026
e482c3a
fix(eval): a crash replayed from the fuzzer is not a tool failure
GuilhermeBn198 Sep 29, 2026
e3a2500
fix(memtrack): check the strings a %s or puts will read
GuilhermeBn198 Sep 29, 2026
f18be77
fix(memtrack): the %s checks behind MAP2CHECK_CHECK_CSTRINGS=1
GuilhermeBn198 Sep 30, 2026
d6da7c5
feat(suite): the fuzzer's corpus in the Cover-Branches suite (knob)
GuilhermeBn198 Sep 29, 2026
d89ef22
docs(tacas): handoff -- strings, fuzzer suite, R21/R22
GuilhermeBn198 Sep 29, 2026
fd83c46
docs(tacas): R17 complete, and why the alternation lost eca-* tasks
GuilhermeBn198 Sep 29, 2026
f1f5237
docs(tacas): handoff -- R23 and the alternation fix
GuilhermeBn198 Sep 29, 2026
7636ec5
feat(hybrid): run KLEE's vectors on natively, completed with zeros
GuilhermeBn198 Sep 29, 2026
54c5d58
docs(tacas): handoff -- vector replay and R24
GuilhermeBn198 Sep 29, 2026
65a9286
fix(eval): the programs under test must not inherit the manifest
GuilhermeBn198 Sep 30, 2026
e972dc4
docs(tacas): R19 and R21 results
GuilhermeBn198 Sep 30, 2026
4f02611
docs(tacas): handoff -- night state
GuilhermeBn198 Sep 30, 2026
49efa33
fix(frontend): an unreadable input program is an error that says so
GuilhermeBn198 Sep 30, 2026
c312c7a
docs(tacas): handoff -- R22 rerun
GuilhermeBn198 Sep 30, 2026
e265f5e
docs(tacas): handoff -- the Crab-LLVM to Clam gap is the next front
GuilhermeBn198 Sep 30, 2026
4fabab4
docs(tacas): handoff -- first probe of the old crab-llvm engine vs Clam
GuilhermeBn198 Sep 30, 2026
dff7246
docs(tacas): INV-1 -- the old crab-llvm vs Clam, and where the gain r…
GuilhermeBn198 Sep 30, 2026
35f32c9
feat(invariants): Clam profiles, an invariant count, and SSA pre-opti…
GuilhermeBn198 Sep 30, 2026
51dc7f0
docs(tacas): handoff -- INV-1 and R25
GuilhermeBn198 Sep 30, 2026
811fc13
docs(tacas): first results of R20, R22, R23 and R24
GuilhermeBn198 Sep 30, 2026
fdd6bd9
chore(release): Map2Check 9.0.0
GuilhermeBn198 Sep 30, 2026
a17aca5
docs(tacas): R21 CASTLE, and the scheduler's collapsed tab fields
GuilhermeBn198 Sep 30, 2026
c3ebf40
docs(tacas): R20 and R23 seeds complete
GuilhermeBn198 Sep 30, 2026
a1506bc
fix(invariants): bound Clam like the slicer
GuilhermeBn198 Sep 30, 2026
e80a478
docs(tacas): overnight results -- R22, R23, R24, R25
GuilhermeBn198 Sep 30, 2026
e8fe0da
feat(hybrid): the alternation and the fuzzer suite become the 9.0 def…
GuilhermeBn198 Sep 30, 2026
3476ff7
docs: campaign plan on the 2765-task Cover-Branches set, witness stud…
GuilhermeBn198 Sep 30, 2026
529d43a
docs(tacas): handoff -- the 9.0 campaign is chained after R26
GuilhermeBn198 Sep 30, 2026
b1f1870
docs(tacas): R26 complete and the first batches of the 9.0 campaign
GuilhermeBn198 Oct 1, 2026
a65377e
docs(tacas): handoff -- resuming the 9.0 campaign after a power loss
GuilhermeBn198 Oct 2, 2026
76eedfc
fix(hybrid): link the fuzzer with libm, and kill a KLEE an interrupt …
GuilhermeBn198 Oct 3, 2026
43ee04e
docs(tacas): the two defects of the 9.0 campaign and the build swap
GuilhermeBn198 Oct 3, 2026
c8a4f6a
docs(tacas): 9.0 campaign -- Cover-Error, CASTLE and Juliet a/b/d com…
GuilhermeBn198 Oct 3, 2026
60597d7
docs(tacas): handoff -- Cover-Branches shard 5 split in four
GuilhermeBn198 Oct 4, 2026
b51ee3d
docs(backlog): campaign sample vs the official Test-Comp 2026 set; as…
GuilhermeBn198 Oct 4, 2026
7c08270
docs(tacas): 9.0 campaign -- Cover-Branches complete
GuilhermeBn198 Oct 5, 2026
e4e0b74
fix(klee): end an assumption-pruned path with _exit, so KLEE writes i…
GuilhermeBn198 Oct 5, 2026
6848d23
fix(suite): assumption-pruned paths give way to deeper ones in a capp…
GuilhermeBn198 Oct 5, 2026
53a43e8
docs(tacas): assume-pruned paths fix and its rerun
GuilhermeBn198 Oct 6, 2026
5d57fff
chore: untrack local documents committed by mistake in 53a43e821
GuilhermeBn198 Oct 6, 2026
e5a86a7
test(testcomp): validate suites with the five Test-Comp 2026 validato…
GuilhermeBn198 Oct 7, 2026
cb99fe7
test(testcomp): replace the validator scripts with a generate/validat…
GuilhermeBn198 Oct 7, 2026
866d350
test(testcomp): bundle the AFL++ toolchain in a self-contained archive
GuilhermeBn198 Oct 7, 2026
44d2160
fix(testcomp): stage each task's own property files
GuilhermeBn198 Oct 7, 2026
4a2dcca
fix(testcomp): drop each validator's scratch so a full corpus fits on…
GuilhermeBn198 Oct 12, 2026
14766fd
test(testcomp): let TESTCOV_S=0 skip the internal TestCov
GuilhermeBn198 Oct 12, 2026
0149e22
test(testcomp): official corpora with proportional stratification
GuilhermeBn198 Oct 12, 2026
3e0dcef
docs(tacas): official Test-Comp environment and the V99 campaign handoff
GuilhermeBn198 Oct 12, 2026
05a1573
fix(nondet): model float, longlong, ulonglong, u8/u16/u32 and nondet_…
GuilhermeBn198 Oct 12, 2026
5146272
docs(tacas): issue #74 fix, probe and the V99 re-run of the affected …
GuilhermeBn198 Oct 12, 2026
a2a164a
docs(tacas): issue #74 re-run report and the KLEE log explosion (#75)
GuilhermeBn198 Oct 12, 2026
4855cbb
docs(changelog): unmodeled nondet types (#74) and the official Test-C…
GuilhermeBn198 Oct 13, 2026
8da5794
fix(runtime): stop the KLEE nondet log from exploding the error path
GuilhermeBn198 Oct 13, 2026
b4bda90
feat(klee): MAP2CHECK_KLEE_MAX_MEMORY knob; changelog for #75
GuilhermeBn198 Oct 13, 2026
a2fbc56
docs(tacas): issue #75 probes and the 40-task CE sample on install_v99c
GuilhermeBn198 Oct 13, 2026
0b149ce
test(testcomp): loop_reads.c is COVERED since #75
GuilhermeBn198 Oct 15, 2026
7db6dd5
fix(frontend): read every nondet type of klee_log.csv
Oct 22, 2026
9c14229
fix(nondet): redirect calls to an existing runtime name instead of re…
Oct 22, 2026
c2bcc6c
fix(counterexample): the C testcase falls back to the violating .ktest
Oct 22, 2026
223194e
fix(memtrack): GNU %m consumes no printf argument
Oct 22, 2026
b25e6af
fix(tests): a tool crash after the fuzzer phase is ERROR
Oct 22, 2026
deea32a
fix(testcomp): make-archive.sh resolves its paths before changing dir…
Oct 22, 2026
fb2423b
docs(testcomp): the test-suite format and how each corpus manifest wa…
Oct 22, 2026
064a666
Merge pull request #73 from hbgit/feat/map2check-9.0
hbgit Oct 23, 2026
e455680
feat(testcomp): smoke test, README and licenses in the Test-Comp archive
Oct 22, 2026
28e14ef
fix(testcomp): complete the archive's license notices; enforce them
Oct 24, 2026
c59e8cd
Merge pull request #85 from hbgit/feat/testcomp27-archive
GuilhermeBn198 Oct 24, 2026
7609c3b
fix(testcomp): the archive's AFL++ phase needs gcc-multilib on the host
GuilhermeBn198 Oct 24, 2026
4186227
Merge pull request #86 from hbgit/fix/testcomp27-archive-toolchain
GuilhermeBn198 Oct 24, 2026
2ee2a0d
fix(testcomp): the smoke test requires evidence that each engine ran
GuilhermeBn198 Oct 24, 2026
cb5a8f8
Merge pull request #87 from hbgit/fix/testcomp27-engine-evidence
hbgit Oct 25, 2026
256321f
Merge remote-tracking branch 'origin/master' into develop
Copilot Oct 26, 2026
3e91452
ci: limit greetings workflow token permissions
Copilot Oct 26, 2026
6e3eacb
test(testcomp): sweep per-task work dirs left by killed runs
GuilhermeBn198 Oct 18, 2026
9fb3718
feat(testcomp): one wrapper and one tool-info module for SV-COMP and …
GuilhermeBn198 Oct 26, 2026
0bca42e
Merge pull request #89 from hbgit/feat/testcomp-unified-wrapper
GuilhermeBn198 Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
242 changes: 234 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,29 @@
#
# Runs on every push and pull request.
# Installs LLVM 16 directly on ubuntu-22.04 runner.
# Unit tests use -DSKIP_KLEE=ON -DSKIP_LIB_FUZZER=ON,
# Unit tests use -DSKIP_KLEE=ON -DSKIP_AFL_PLUS_PLUS=ON,
# so the full Dockerfile.dev dependencies are not needed.
#
# Phase 1.5 — OpenSSF Best Practices Badge (Analysis section)
############################################################
name: CI

on:
# Push cobre só as branches de integração. O filtro antigo listava 'feat-*'
# com hífen, que nunca casou com a convenção real (feat/castle-juliet-baseline,
# feat/testcomp-conformance) -- então nenhum push de branch era verificado, e
# todo run verde até aqui veio do gatilho pull_request.
#
# Branches de feature ficam cobertas pelo pull_request abaixo, e não por push,
# para não disparar dois runs idênticos a cada push numa branch com PR aberta.
push:
branches: [develop, main, master, 'feat-*']
pull_request:
branches: [develop, main, master]
# Inclui feat/** como ALVO para que PRs empilhadas sejam verificadas. Sem isso
# uma PR cuja base é outra branch de feature não dispara nada -- a #56 abriu
# com um único check -- e os gates de regressão que ela própria adiciona nunca
# rodariam nela.
pull_request:
branches: [develop, main, master, 'feat/**']

jobs:
# ===========================================================
Expand Down Expand Up @@ -48,7 +59,7 @@ jobs:
mkdir -p build && cd build
cmake .. -G Ninja \
-DLLVM_DIR=/usr/lib/llvm-16/lib/cmake/llvm \
-DSKIP_LIB_FUZZER=ON \
-DSKIP_AFL_PLUS_PLUS=ON \
-DSKIP_KLEE=ON \
-DENABLE_TEST=ON
env:
Expand Down Expand Up @@ -93,7 +104,7 @@ jobs:
mkdir -p build && cd build
cmake .. -G Ninja \
-DLLVM_DIR=/usr/lib/llvm-16/lib/cmake/llvm \
-DSKIP_LIB_FUZZER=ON \
-DSKIP_AFL_PLUS_PLUS=ON \
-DSKIP_KLEE=ON \
-DENABLE_TEST=ON \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
Expand Down Expand Up @@ -180,7 +191,7 @@ jobs:
mkdir -p build && cd build
cmake .. -G Ninja \
-DLLVM_DIR=/usr/lib/llvm-16/lib/cmake/llvm \
-DSKIP_LIB_FUZZER=ON \
-DSKIP_AFL_PLUS_PLUS=ON \
-DSKIP_KLEE=ON \
-DENABLE_TEST=ON \
-DMAP2CHECK_ENABLE_SANITIZERS=ON
Expand Down Expand Up @@ -291,7 +302,222 @@ jobs:
'

# ===========================================================
# Job 5: Dynamic Analysis — Valgrind memcheck (OpenSSF)
# Job 5: CASTLE Benchmark Regression Tests
# ===========================================================
# Verifies Map2Check against 5 CASTLE micro-benchmarks
# (CWE-415, 416, 476, 787) — memory safety regression suite.
castle-regression:
name: CASTLE Regression
runs-on: ubuntu-22.04
timeout-minutes: 20
needs: [build-and-test]

steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Free disk space
run: |
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc
sudo docker image prune -a -f || true

- name: Pull map2check-dev image
run: docker pull ghcr.io/hbgit/map2check-dev:latest

- name: Build + install Map2Check in container
run: |
docker run --rm \
-u root \
-v "${{ github.workspace }}:/workspace" \
-w /workspace \
-e CC=/usr/bin/clang-16 \
-e CXX=/usr/bin/clang++-16 \
ghcr.io/hbgit/map2check-dev:latest bash -c '
rm -rf build_castle_ci install_castle_ci
mkdir -p build_castle_ci && cd build_castle_ci
cmake .. -G Ninja \
-DLLVM_DIR=/usr/lib/llvm-16/lib/cmake/llvm \
-DENABLE_TEST=ON \
-DMAP2CHECK_DYNAMIC_LINK=ON \
-DCMAKE_INSTALL_PREFIX=/workspace/install_castle_ci
ninja
ninja install
mkdir -p /workspace/install_castle_ci/lib/klee
ln -sf /opt/klee/lib/klee/runtime /workspace/install_castle_ci/lib/klee/runtime
ln -sf /usr/lib/llvm-16/lib/clang /workspace/install_castle_ci/lib/clang
'

- name: Run regression tests
run: |
docker run --rm \
-u root \
-v "${{ github.workspace }}:/workspace" \
-w /workspace \
-e MAP2CHECK_PATH=/workspace/install_castle_ci \
ghcr.io/hbgit/map2check-dev:latest bash -c '
bash tests/integration/test_verdict_classifier.sh
bash tests/integration/test_juliet_sampling.sh
bash tests/integration/test_castle_regression.sh
bash tests/integration/test_main_argv.sh
bash tests/integration/test_modes.sh
bash tests/integration/test_add_invariants.sh
bash tests/integration/test_test_suite_emission.sh
bash tests/integration/test_target_coverage.sh
bash tests/integration/test_ktest_object_names.sh
bash tests/integration/test_testcomp_regressions.sh
bash tests/integration/test_exit_codes.sh
bash tests/integration/test_cwe_mode_mapping.sh
'

# ===========================================================
# Job: Invariants — o contrato do --add-invariants
# ===========================================================
# Roda o MESMO teste em qualquer estado em que a imagem esteja. Enquanto a
# imagem publicada não trouxer o Clam, ele afirma que a flag falha alto
# (issue #54). Quando a imagem passar a trazê-lo, o mesmo teste afirma que a
# flag tem sucesso E injeta verifier.assume. A linha CAPABILITY no log diz
# qual contrato foi verificado, então a volta da capacidade fica visível em
# vez de inferida.
#
# Nenhum check vermelho é estacionado de propósito: um check que se espera
# vermelho passa a ser ignorado, e aí ninguém percebe o dia em que fica verde.
invariants-clam:
name: Invariants (Clam)
runs-on: ubuntu-22.04
timeout-minutes: 25
needs: [build-and-test]

steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Free disk space
run: |
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc
sudo docker image prune -a -f || true

- name: Pull map2check-dev image
run: docker pull ghcr.io/hbgit/map2check-dev:latest

- name: Build with -DENABLE_CLAM=ON
run: |
docker run --rm \
-u root \
-v "${{ github.workspace }}:/workspace" \
-w /workspace \
-e CC=/usr/bin/clang-16 \
-e CXX=/usr/bin/clang++-16 \
ghcr.io/hbgit/map2check-dev:latest bash -c '
rm -rf build_clam_ci install_clam_ci
mkdir -p build_clam_ci && cd build_clam_ci
cmake .. -G Ninja \
-DLLVM_DIR=/usr/lib/llvm-16/lib/cmake/llvm \
-DENABLE_CLAM=ON \
-DMAP2CHECK_DYNAMIC_LINK=ON \
-DCMAKE_INSTALL_PREFIX=/workspace/install_clam_ci
ninja
ninja install
mkdir -p /workspace/install_clam_ci/lib/klee
ln -sf /opt/klee/lib/klee/runtime /workspace/install_clam_ci/lib/klee/runtime
ln -sf /usr/lib/llvm-16/lib/clang /workspace/install_clam_ci/lib/clang
'

- name: Assert the --add-invariants contract
run: |
docker run --rm \
-u root \
-v "${{ github.workspace }}:/workspace" \
-w /workspace \
-e MAP2CHECK_PATH=/workspace/install_clam_ci \
ghcr.io/hbgit/map2check-dev:latest bash -c '
bash tests/integration/test_add_invariants.sh
'

# ===========================================================
# Job: Test-Comp conformance — o validador oficial
# ===========================================================
# Afirma que uma suíte emitida REPRODUZ o bug, que é o que a competição
# pontua. A validade estrutural do XML é afirmada à parte, pelo
# test_test_suite_emission.sh no job do CASTLE — uma suíte pode ser
# perfeitamente bem formada e valer zero ponto.
#
# Note que o TestCov sai com código 0 tanto quando cobre quanto quando não
# cobre; o veredito está na linha "Result:". Ver
# tests/testcomp/NOTES-testcov-output.md.
testcov-gate:
name: Test-Comp Validation (TestCov)
runs-on: ubuntu-22.04
timeout-minutes: 25
needs: [build-and-test]

steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Free disk space
run: |
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc
sudo docker image prune -a -f || true

- name: Pull map2check-dev image
run: docker pull ghcr.io/hbgit/map2check-dev:latest

- name: Build + install Map2Check in container
run: |
docker run --rm \
-u root \
-v "${{ github.workspace }}:/workspace" \
-w /workspace \
-e CC=/usr/bin/clang-16 \
-e CXX=/usr/bin/clang++-16 \
ghcr.io/hbgit/map2check-dev:latest bash -c '
rm -rf build_testcov_ci install_testcov_ci
mkdir -p build_testcov_ci && cd build_testcov_ci
cmake .. -G Ninja \
-DLLVM_DIR=/usr/lib/llvm-16/lib/cmake/llvm \
-DMAP2CHECK_DYNAMIC_LINK=ON \
-DCMAKE_INSTALL_PREFIX=/workspace/install_testcov_ci
ninja
ninja install
mkdir -p /workspace/install_testcov_ci/lib/klee
ln -sf /opt/klee/lib/klee/runtime /workspace/install_testcov_ci/lib/klee/runtime
ln -sf /usr/lib/llvm-16/lib/clang /workspace/install_testcov_ci/lib/clang
'

- name: Run TestCov over the conformance corpus
run: |
docker run --rm \
-u root \
-v "${{ github.workspace }}:/workspace" \
-w /workspace \
-e MAP2CHECK_PATH=/workspace/install_testcov_ci \
-e KEEP_WORK=1 \
ghcr.io/hbgit/map2check-dev:latest bash -c '
# zip for the suite archive, gcc/lcov for coverage measurement.
apt-get update -qq
apt-get install -y -qq python3-pip zip gcc lcov
pip3 install --quiet testcov
# The tool-info module is what BenchExec loads on competition
# infrastructure. Nothing else here exercises it, and a wrong one
# only shows up days after submission as every task erroring out.
python3 tests/integration/test_benchexec_toolinfo.py
# Cover-Branches: the other competition category, and the one
# whose suite has more than one test case. Validated by TestCov,
# not by inspecting the XML -- only the validator can say whether
# the branches are actually exercised.
MAP2CHECK_PATH=/workspace/install_testcov_ci \
bash tests/integration/test_cover_branches.sh
bash tests/testcomp/run_testcov_suite.sh
'

# ===========================================================
# Job 6: Dynamic Analysis — Valgrind memcheck (OpenSSF)
# ===========================================================
# Build ISOLADO e SEM sanitizers: a shadow memory do ASan/UBSan
# conflita com a VM do Valgrind. Debug + DWARF-4 para stacks
Expand Down Expand Up @@ -326,7 +552,7 @@ jobs:
mkdir -p build && cd build
cmake .. -G Ninja \
-DLLVM_DIR=/usr/lib/llvm-16/lib/cmake/llvm \
-DSKIP_LIB_FUZZER=ON \
-DSKIP_AFL_PLUS_PLUS=ON \
-DSKIP_KLEE=ON \
-DENABLE_TEST=ON \
-DCMAKE_BUILD_TYPE=Debug \
Expand Down
24 changes: 21 additions & 3 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,17 @@
# Publish map2check-dev Docker image to GitHub Container Registry
#
# Triggers:
# - Push to develop (Dockerfile.dev changes)
# - Manual dispatch (workflow_dispatch)
# - Push to develop (Dockerfile.dev changes) -> build AND push
# - Pull request touching Dockerfile.dev -> build only, no push
# - Manual dispatch (workflow_dispatch) -> build AND push
#
# The pull_request trigger is not decoration. Until it existed, Dockerfile.dev
# was only ever built after a merge, so a recipe that cannot build reached
# develop and broke the image: the Clam section built with the default cc
# (GCC 11) instead of clang-16, and GCC rejects a construct in sea-dsa that
# clang only warns about. Nothing pre-merge could have caught that, because
# nothing pre-merge compiled the file. It is paths-filtered, so PRs that do not
# touch the Dockerfile pay nothing.
#
# Phase 1.5 — OpenSSF Best Practices Badge
############################################################
Expand All @@ -14,6 +23,10 @@ on:
branches: [develop]
paths:
- 'Dockerfile.dev'
pull_request:
branches: [develop, main, master]
paths:
- 'Dockerfile.dev'
workflow_dispatch:

env:
Expand All @@ -32,7 +45,10 @@ jobs:
- name: Checkout
uses: actions/checkout@v4

# Skipped on pull_request: the run does not push, and a PR from a fork
# has no packages:write token to log in with anyway.
- name: Log in to GHCR
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
Expand All @@ -48,11 +64,13 @@ jobs:
type=raw,value=latest
type=sha,prefix=

# push is false on pull_request: the point there is to prove the recipe
# builds, not to publish an image from an unmerged branch over :latest.
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile.dev
push: true
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
3 changes: 3 additions & 0 deletions .github/workflows/greetings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ on: [pull_request, issues]
jobs:
greeting:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/first-interaction@v1
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
############################################################
# Map2Check Release — Draft Release automático no master
#
# Build completo (KLEE 3.1 + LibFuzzer) dentro da imagem
# Build completo (KLEE 3.1 + AFL++) dentro da imagem
# ghcr.io/hbgit/map2check-dev, empacota release/ em .zip e
# publica Draft Release via semantic-release.
############################################################
Expand Down
Loading
Loading