Rust certification in S-CORE: gap analysis and plan (September 2026) #3254
dcalavrezo-qorix
started this conversation in
Infrastructure Community
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Rust certification in S-CORE: gap analysis and plan (September 2026)
This is a proposal for review by the Rust community, the tooling community and the safety manager. It takes stock of what we still need before a Rust ASIL B module can pass a confirmation review, against ISO 26262:2018 and our own process. Sources: the S-CORE process and platform documents, project board #34 "Rust certification", the Ferrocene public qualification documents and the published work of the Safety-Critical Rust Consortium. Board and issue state as of 2026-09-14.
State legend: 🔴 gap (nothing usable exists) · 🟡 partial (started, not certifiable yet) · 🟢 done (in place, keep) · 🔵 external (depends on Ferrous, QNX or the consortium)
TL;DR
Rust was approved for ASIL B components in DR-001-Arch (March 2026) on the evidence that formatting, linting and a qualified compiler were in hand and that coverage, core library and coding guidelines were on their way. Six months on, the tooling has moved, but very little has been turned into the work products ISO 26262 and our process ask for.
The five blockers, in order:
rules_rustandscore_toolchains_rustas "not relevant", which is wrong.coresubset is ASIL B, butallocandstdare uncertified and most of our Rust code usesstd. The Ferrous offer decision DR-001 set for July 2026 has no open tracking item.-Zcoverage-options=branchis nightly-only. It works today only because the pin is rolling. The coverage tool documents this itself and is otherwise our best-documented Rust tool, but nothing in the platform documents references it yet.Two findings that were not on anyone's list:
1. Baseline
What our process demands of Rust code
#![forbid(unsafe_code)], edition 2021; host compiler "pick your own".What Ferrocene gives us
rustcplusrust-lldqualified TCL3, ISO 26262 ASIL D, IEC 61508, IEC 62304 Class C. Signed documents and the TÜV report are Enterprise-tier deliverables.coresubset at ASIL B, enforced by theferrocene::unvalidatedlint.alloc,std,testare uncertified.cargo,clippy,rustfmt,rustdoc, LLVM tools, criticalup and the self-test are explicitly not qualified.--edition 2021,-C opt-level=2,-C panic=abort, listed targets. QNX 8 targets land in 26.08.0, not yet released.RUSTC_CSTR_*/CORE_CSTR_*constraints the user must fulfil. These become assumptions of use for S-CORE.What the consortium gives us
draft, covering 5 of 19 spec chapters. Nothing on unsafe, FFI, concurrency, errors or patterns.2. Gap register
Each row is something that has to exist, or exist in a different form, before an assessor accepts Rust ASIL B code from a module. Where the board already has an issue, the gap is the missing content, not the missing ticket.
A. Compiler and toolchain qualification
doc_tool__ferrocene_rustcon the QCC pattern: use cases compile / link / instrument, TCL LOW, qualification section referencing vendor kit + Safety Manual constraints779fbed0(rolling, Dec 2025); tool list says "1.90.0"CSTRitems (clean env, clean build,-D warnings, no-A, build-log monitoring, KP handling, unsafe module rules)score_rust_policiesas toolchain default; CI check that ASIL targets do not deviateB. Standard library, async runtime and third-party crates
stdfor ASIL codecore+ qualified baselibs, or (c) qualify astdsubset per ISO 26262-8 Clause 12. Record as design decision with costferrocene::unvalidatedlint not inscore_rust_policiesferrocene::prevalidatedcoregaps vs S-CORE usagecore::{task,pin,future,ffi}missing;fmtandpanic!added in 26.05.0pastey) classified, ~50 in the index unqualified; #2027/#2028 emptypasteymatrix is the only example;CORE_CSTR_0060requires verifying generated codeC. Coding guidelines
doc__rust_coding_guidelinesas a rule set (~60–90 rules): ID, category (mandatory/required/advisory, MISRA Compliance:2020), source (SCRCgui_id, MISRA Add. 6, CERT, own), enforcement (compiler / clippy / CodeQL / Miri / review), ASIL scopeRUSTC_CSTR_0100requires module containment, safety comments, two senior reviewers, dedicated tests// SAFETY:(lint already deny), Miri required, review by two, how a safe wrapper is qualifiedextern "C"only, no panics across the boundary,#[repr(C)], bindgen/cbindgen policy, ownership contract per function, matching rule on the C++ sideErrin an ASIL unit;panic=abortmandatory with certified coreRUSTC_CSTR_0110)#[allow(..., reason = "DEV-…")]enforced on ASIL crates; reported in the module safety casedoc__rust_api_designdraft; #2031 BacklogD. Static analysis and lint tooling
doc_tool__clippyevaluated, TCL HIGH, names 1.90.0 while the toolchain is a Ferrocene commitscore_rust_policies, run per toolchain bumprust_miri_testrule or aspect in score_tooling; run on crates with unsafe; TVR (likely HIGH)E. Structural coverage
tool_reqwith generated test links, 10 constraints of use, known problems, verification report (223 unit cases, 11 Starlark tests, 15 e2e checks vs. golden LCOV), self-coverage 95.6 % / 87.2 %; all documents draft. In the score repo: nodoc_tool__score_coverage, no tool-list row, verification plan still says gcovr / "tooling provided by Ferrocene". #2591 still targets symbol-report/blanketdoc_tool__score_coverage: malfunction table from ERR-01..10, "requires qualification", qualification section linking the tool's requirements, verification report and constraints. Tool-list row. Update verification plan and DR-001. Close #2591 as superseded. Before "qualified": close the tool's own deviations and raise its docs to valid-Zcoverage-options=branchnightly-only (#79649), nomatch-arm branches (#124118); coverage_tool known problems: "on a stable-channel Ferrocene drop the flag; Rust branch coverage is then not available"; CSTR-01 excludes QNX on-targetmatch-arm limitation as a constraint requiring manual justificationCORE_CSTR_0060)COV_JUSTIFIEDmarkers, stale detection, raw vs effective, CSTR-07 review like codeF. Testing
rust_test+ documented assertion crate;doc_tool__rust_libtestas LOW; validate with a known-failing test setG. Build system and supply chain
rules_rustandscore_toolchains_rustmarked "not relevant"RUSTC_CSTR_0030puts build-action correctness on the userdoc_tool__bazeldraft, LOWCargo.lock+Cargo.Bazel.lock; coverage_tool requires--lockfile_mode=error; nothing vets sourcescrates_vendorlocal mode for ASIL deps; cargo-deny + cargo-audit in CI; audit recorded as Clause 12 evidenceH. Process, plans and traceability
gd_temp__module_safety_planlinking A6, B2, B5, C5I. Runtime and architecture constraints
panic=abortmandatory with certified core = process exit on QNX; no supervisor mechanism describedno-panicproofs (needs an unwind build) for the smallest ASIL crates-Z emit-stack-sizesunstable, cargo-call-stack staleallocuncertified;containers_rusthas fixed-capacity types but no classification; baselibs safety manual lists only C++ featuresJ. Organisation, budget and external dependencies
3. What the consortium gives us, and what it does not
Use now
gui_IDs, adopt their category semantics, decidability and scope fields.Do not wait for
4. The document set we should end up with
Mapped onto the Ferrocene structure we want to copy:
doc__rust_coding_guidelinesrewritten)doc_tool__ferrocene_rustc)doc_tool__score_coverage)doc_tool__rust_libtest)5. Roadmap
Dates assume Ferrocene 26.08.0 with QNX 8 targets ships in Q4 2026. If it slips, phase 2 slips with it; phases 0, 1 and most of 3 do not depend on it.
Phase 0 — Sep to Oct 2026: decide and clean up
Phase 1 — Oct to Dec 2026: guidelines and usage rules
Phase 2 — Nov 2026 to Feb 2027: tool verification reports
Phase 3 — Jan to Apr 2027: pilot module and confirmation review
Continuous: per Ferrocene release: KP review (A7), certified-core delta (B3), lint validation re-run (D1), TVR version bump. Per quarter: consortium report, guideline delta vs SCRC, tool list review.
6. Proposed changes to project board #34
The board has 50 items (20 Backlog, 8 In progress, 22 Done). Board status and issue state agree on all 50. Priority and Size are empty everywhere. The eight "In progress" items have been idle for 1 to 9 months; six of them wait on the same thing, an answer from or decision about Ferrous (J1).
Reopen or re-scope: #2434 (until a qualified QNX 8 release is pinned), #2432 (child #2966 open; add D1, D3, D6, D7), #2591 (close as superseded; new issue for the platform-side coverage TVR, tool-list row and plan update), #1208 (make it the epic for C1–C11, pull #2034, #2031, #2033, process_description#544 under it), #2111 (reopen as parent of this register).
Create: the six design decisions (Phase 0); TVR issues for Ferrocene rustc, coverage tool, libtest, CodeQL-Rust, Miri, rules_rust + toolchain module, proptest; Rust Toolchain Usage Guideline; crate qualification guideline promotion; FFI and mixed-language rules; build manifest; reproducibility; SBOM; Rust inspection checklist; Rust safety training; pilot module; consortium representation.
Close: #2035 (empty, labelled trash), #2585 (placeholder), #2006 once children are re-parented, #2015 MC/DC as "not required at ASIL B".
Fields: set Priority per phase; use the register IDs in titles so board and register stay linked.
Sources
Ferrocene public docs are the unsigned development preview; signed release documents are customer-only. Gap count and phase dates are proposals for review.
All reactions