Repository navigation
Mutation testing on armv7 - #538
Conversation
Quest-Claim: b695f01d26593fff
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rows pick qemu's CPU as sh/armv7.sh's tiers do and assert the detected features, the NEON Poly1305's freeze is tested on h >= p, zero_bytes is tested on every backend, and the equivalent survivors are recorded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 25 minutes. View limit details
Pre-merge checks:
|
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
The armv7 mutation-testing campaign, its CI wiring, and the tests that kill the boundary mutants it needed.
admin/mutants --target armv7-unknown-linux-gnueabihf: the new armv7 case cross-builds and runs each test binary underqemu-arm; its base run and two rows mirrorsh/armv7.sh's three tiers exactly (QEMU_CPU=maxwith NEON and the crypto extension, a Cortex‑A15 with NEON alone, and one with NEON denied viaRIND_CPU_DISABLE_neon), and the release-plus-debug-assertions profile matches whatsh/armv7.shexports. The native campaigns still behave:base/runnerstay empty for them, and the--runhandler keeps exiting before the rows on--list.shellcheckis clean.mutants.yml: the include-only matrix and per-arch artifact names are right — the rename tomatrix.nameis required, since x86_64 and armv7 both run onubuntu-latestand would collide under the oldmatrix.osnames.nix develop ".#default"and.#armv7both exist inflake.nix, the armv7 shell now carriescargo-mutants/cargo-nextest, and thesurvivorsjob'smutants/*/glob picks up the new names.mid/mod.rs: the#[cfg]+#[path]swap for the portableaes_gcm/ed25519modules compiles on every backend — I checked the arm backend forarmv7-unknown-linux-gnueabihfand the portable backend forced on both x86_64 and armv7 — and addingmid/portableto the x86_64/aarch64 skip lists correctly keeps those files from generating unreachable mutants now that cargo-mutants follows the#[path].poly1305_arm.rsfreezetest: I verified all five assertions against the 26-bit limb arithmetic by hand (h = p → 0, h = p+4 → 4, p−1 unchanged, the carry chain through[MAX+1, MAX, MAX, MAX, 0], and 2^130 → 5). It kills the line‑98y0 ^= x0mutant, and the recorded limbs‑1–4 exclusions are genuinely equivalent: those limbs are all-MAXexactly when the subtraction path runs, soy_i & ~x_icollapses to the correct value there. ThePoly1305Neon::finishexclusion also holds — the2^128bit sits above the 16-byte tag.zero_bytestest move:low/tests.rsis gated to x86_64/aarch64, so the move intolow/generic/zeroise.rs(which already importscrate::low::zero_bytes) makes it run on armv7 and portable too; it passes natively (ran it)..cargo/mutants.toml: every pinned line matches the current sources (low/arm/cpu.rs38/40/70/83–88/96/104,poly1305_arm.rs99–102), and no existing pin broke —mid/mod.rskeeps its line count and both new test modules append at file ends. The(83|85|86|87|88)&→|/^exclusions are sound: the&&chain means a single one only differs on a CPU with a partial crypto extension, which no qemu tier models. The widenedghash_nohwregex matches the path armv7 actually reaches the file by (low/portable/../generic), and the five droppedmid/p384.rsentries arearm|portable-cfg'd functions armv7 now compiles and tests —multiply_matches_double_and_addexercises them directly.- Quest docs: the quest file is closed and removed from the m3 README,
portable-fuzz-mutants.mdnow records the armv7 campaign's remaining gaps, and no other doc still claims only two campaigns.
ℹ️ Sequencing and evidence
#513 is still open, so until it lands the nightly armv7 job fails its baseline (zeroing.rs's cipher test on tiers without the crypto extension) — the PR body already documents this and asks for that merge order, so this is only the reminder to hold it. Separately, there is no dispatched mutants.yml run on this branch, so the campaign numbers rest on the local runs; the first nightly after merge is where the recorded exclusions get their CI confirmation.
Technical details
# Sequencing and CI evidence for the armv7 campaign
## Affected sites
- .github/workflows/mutants.yml (armv7 matrix entry) — runs `-p rind --features wipe`,
whose `rind/tests/zeroing.rs` baseline fails on non-crypto-ext armv7 tiers until #513 lands.
- .cargo/mutants.toml — the 187 recorded misses come from local campaign runs; no
dispatched run artifacts exist for the branch to audit.
## Required outcome
- None before merge: the ordering constraint is the PR's own documented decision.
If #513 lands second, expect nightly mutants alerts until it does.
## Open questions for the human (optional)
- Consider dispatching `mutants.yml` on this branch after #513 merges (or on a stack
containing both) to leave CI evidence of the armv7 job wiring and the exclusions.glm-5.3 | 𝕏
Keeps main's macOS DIT and AVX-512 campaigns beside the armv7 one, moves the zero_bytes test to call the now-unsafe fn, deletes the finished m3 confidence README, and records the kept wipe follow-up as quest/m2/confidence/mutants-wipe.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Maintainer decision (2026-11-11, (Written by Claude Opus 5.5 with high) |
…utants-armv7 # Conflicts: # admin/mutants
…utants-armv7 # Conflicts: # .cargo/mutants.toml

Finishes quest/m3/confidence/mutants-armv7.md:
admin/mutantsruns on armv7 under qemu-arm, every armv7 survivor is killed by a test or recorded with its reason, andmutants.ymlruns armv7 nightly.Summary
admin/mutants --target armv7-unknown-linux-gnueabihf, innix develop .#armv7, cross-builds and runs each test binary under qemu-arm. Its rows aresh/armv7.sh's tiers: qemumax(NEON and the crypto extension), a Cortex-A15 (NEON alone), and a Cortex-A15 with NEON denied. Each row setsRIND_TEST_ARM_NEON/RIND_TEST_ARM_CRYPTO_EXT, so a mutant that breaks CPU detection failsdetects_the_expected_cpu.sh/armv7.shtests: the debug baseline under qemu took 703s, release 79s.mutants.ymlgains an armv7 matrix entry (-p rind --features wipe), and its artifacts are named by architecture (x86_64,aarch64,macos,armv7) soadmin/mutants --survivorscombines them all; theavx512job now downloadsmutants-x86_64.mid/mod.rsswaps the portableaes_gcm/ed25519modules with#[cfg] #[path]rather thancfg_attr(path), which cargo-mutants does not follow, so it mutatesmid/portable.freezeonhin[p, 2^130), which random inputs reach with probability about 2^-128; andzero_bytes's test moves fromlow/tests.rs(x86_64 and aarch64 only) tolow/generic/zeroise.rs, so it runs on armv7 and the portable backend too..cargo/mutants.toml: records the equivalent survivors in the existing groups (ORs of disjoint bits in the bitsliced AES, Keccak interleaving, and GCM lengths; NEON-or-scalar path choices;freeze's limbs that are zero whenever kept; inner key types whose wrapper wipes the whole value), widens theghash_nohwentries to itsportable/../genericpath, and drops the fivemid/p384.rs"armv7 only" exclusions, which armv7 now catches.Campaign
All 1,856 mutants in the files only armv7 reaches (
low/arm,low/portable,mid/portable,low/generic/order.rs) and the shared files with arm or portablecfgblocks (low/generic/bignum.rs,mid/p384.rs,low/cpu.rs), on armv7 under qemu: 1,612 caught, 21 timeouts, 36 unviable, 187 missed. x86_64 catches the shared files' misses except those listed under Follow-ups. After this PR, re-running every miss on armv7 (with--features wipe) leaves none that are not recorded.Public API
None. Test and CI only.
Validation
On the merge with main (
just checkon b3331bd; the armv7 and Miri runs on d923e66, the merge before moq-dev/rind#603, whose test-only and x86_64 changes CI's armv7 rows cover):quest gate nix develop --command just check: passes.quest gate nix develop .#armv7 --command sh/armv7.sh(clippy and all three tiers): passes.sh/miri.sh's flags on x86_64 and s390x, filtered to the tests this PR adds or reaches (low::generic::zeroise,mid::aes_gcm, the ed25519 tests overmid/portable): all pass. Themiriworkflow's jobs hit the 6-hour limit here, as on main's nightly (run 42917952991) and every other PR that runs it: they hang on moq-dev/rind#555'sacvp_*andcavp_ecdhvector tests, whichsh/miri.shdoes not skip, andlow::guard_pages(moq-dev/rind#568) fails under Miri, which cannotmmapwithPROT_NONE. Neither is this PR's.build (--release)andbinsecfailures were main's, fixed by moq-dev/rind#607 and moq-dev/rind#604; other PRs with main merged pass them.admin/mutants --target armv7-unknown-linux-gnueabihf -p rind --features wipe --file rind/src/low/arm/poly1305_arm.rs --re freeze: baseline passes on every row, and all 42 mutants are caught.shellcheck admin/mutantsandquest check: clean.Follow-ups
--features rind/wipeon x86_64 and aarch64 too. Without it everyDropthat wipes a key is a survivor there, such asmid/ed25519.rs'sSigningKey::drop. No open decisions.Decisions
/quest-completeround: ✅ keep thewipemutants plan, recorded as its own quest (rejected: drop it). ✅ Droplow/cpu.rs's DIT andverify_cpu_featuressurvivors (now covered by main's macOS DIT campaign, and by CPUs that lack a required feature, which no host is) andbignum.rs's portable-only survivors, which quest/m2/confidence/portable-fuzz-mutants.md covers.wipebaseline passes and no ordering remains.Merge with main
main gained a macOS DIT campaign (moq-dev/rind#578), an AVX-512 campaign under SDE (moq-dev/rind#570), and PR-triggered runs (moq-dev/rind#575).
admin/mutantskeeps all three beside--target, selecting the campaign by${target:-$(uname -sm)}. main also madezero_bytesanunsafe fn(moq-dev/rind#583), so the moved test calls it inunsafe. This PR finishes the last quest underquest/m3/confidence/, so it deletes that README and the m2 epic's pointer to it, plusTESTING.md's dead link to the finishedquest/m3/confidence/vectors.md..cargo/mutants.tomldrops the DIT and AVX-512 entries main removed and takes main's shifted line numbers.A second merge took main's split of the CPUs between parallel jobs' tests (moq-dev/rind#574) in
admin/mutants, keeping this PR's--targetin the runner it exports.A third took moq-dev/rind#603, which deleted the
mutants-edge-cases.mdentries in.cargo/mutants.tomlbeside the p384 "armv7 only" entries this PR deletes; both stay deleted.Models
Size: M
Implementer: unknown (starter session, first commit)
Implementer: Claude Code, claude-opus-5-5, medium effort (iterate, M)
Implementer: Claude Code, claude-opus-5-5, medium effort (iterate, M)
Implementer: Claude Code, claude-opus-5-5, medium effort (iterate, M)
(Written by Claude Opus 5.5 with medium effort)
Review
Rewritten by
quest reviewafter each round.01a1cbe4-aa98-7623-bd81-1e271956ee61, round 2The update merges the base changes and preserves the previously reviewed branch changes without introducing actionable defects; builds and tests were not run as instructed.