NoWayOS
JA
GitHub
メニュー閉じる

チェックと貢献

チェックと根拠

make ciが何を実行し、各チェックが何を示すか。すべてのクレートが守る基本ルール。イメージのseL4記録と部品表の読み方。そして、ゲートを速く保つ方法。

NoWayOSの主張は多くありません。そして、そのひとつひとつを、実行できるチェックで裏付けています。このページでは、各チェックが何を示し、何を示さないかを説明します。

すべてをひとつのコマンドで

make ci

make ciはゲート全体で、次の順に実行します。シークレットのスキャン、リント、テスト、ドキュメント、デモ、no_stdビルド、ライセンスとアドバイザリのチェック、グリフアトラス、部品表、ファジングとKaniの証明、そしてシステムのチェックとQEMUでの起動。すべてのステップが通ったときにだけ、変更は合格します。

各チェックが示すもの

コマンド 示すもの
make test ユニット、プロパティ、ドキュメント、ゴールデンイメージのテスト。コードがテストのとおりに動き、すべての画面が承認どおりに正確に描かれること
make lint rustfmtとclippy。警告はエラーとして扱います
make nostd すべてのデバイス用クレートが、標準ライブラリなしで、ベアメタル(aarch64-unknown-none)向けにビルドできること
make deny すべてのワークスペースが守るべきベースライン、続いてcargo-deny。ライセンス、ソース、禁止クレート、既知のアドバイザリ
make secrets ツリーとすべてのコミットを、鍵や認証情報がないかオフラインでスキャン
make fuzz すべてのファズターゲットをlibFuzzerでビルドし、生成した入力に対して、それぞれFUZZ_SECONDS(10秒)ずつ実行
make kani Kaniの有界証明。各レコードデコーダが、最長のレコードまでのあらゆる入力に対して、パニックもオーバーフローも境界外の読み出しも決して起こさないこと。各証明が失敗しうることを示すミューテーションチェック付き
make unsafe-audit unsafeなコードが、承認済みの一覧が許す場所にしか現れないこと
make pds-miri unsafeを許されたクレートのテストをMiriで実行し、未定義動作がないかをチェック
make sbom すべてのワークスペースの、CycloneDX形式の部品表
make image-sbom SYSTEM=NAME イメージとその部品表。カーネル、ローダー、モニター、すべての保護ドメインと、それぞれに含まれるクレートとそのハッシュ
make sel4-config-check 記録されているseL4の検証状況が、固定されたMicrokit SDKに対応するものであること
make qemu-test-all すべてのシステムが、記載された各構成でQEMU上で起動し、期待出力ファイルのとおりに出力すること

有界証明は、定められたサイズまでの入力についての証明であって、ありうるすべての入力についての証明ではありません。ファジングはクラッシュを見つけますが、クラッシュがないことは示せません。テストが示すのは、テストしたケースだけです。どれも、それが示せることのために、持つ価値があります。

すべてのクレートが守る基本ルール

これらはガイドラインではなく、すべてのワークスペースにあるリントとチェックです。

  • unsafeは使わない。例外は、ハードウェアやメモリに直接触れる、承認済みの短いクレートとファイルの一覧だけです。一覧への追加には、理由の明記とレビューが必要です。
  • 外部入力でパニックしない。ライブラリのコードにunwrap、expect、panic!はなく、チェックなしのインデックスや算術もありません。リントの例外には、すべて理由が書かれています。
  • デバイス用クレートはno_stdで、何も確保しない。リリースビルドでもオーバーフローチェックを残し、パニックしたら、そのまま続けるのではなく、その部分を止めます。
  • パーサーは、大きすぎる入力をコピーする前に拒否する。型付きのエラーを返し、プロパティテストとファズターゲットを備えています。
  • シークレットは、どこにも置かない。開発用の鍵でさえも。テスト用の鍵はテストの実行時に作り、保存はしません。

イメージの記録を読む

すべてのイメージはbuild/BOARD/SYSTEM/に書き出され、その隣に二つの記録が置かれます。

sel4-config.txt は、イメージの名前、ハッシュ、ボード、Microkit SDK、カーネルを記した後、そのイメージがseL4の証明に対してどこに位置するかを、理由ごとに1行のstatus:で述べます。そして、その判断を左右する各カーネルオプションを、検証済み構成の値と並べて一覧にします。デバッグカーネルは開発ビルドです。マルチコアや混合クリティカリティのカーネル、あるいはseL4の一覧にないボードは、seL4の証明の範囲外です。すべてのオプションが一致するカーネルであっても、決して“検証済み”とは呼びません。記録は事実を示し、そこで終わります。

sbom.cdx.json は、イメージのCycloneDX形式のソフトウェア部品表です。何からできているかを、各保護ドメインの各クレートに至るまで、それぞれsha256付きで記します。

ゲートを速く保つ

証明とファジングをすべて行うと長い時間がかかるので、日常のmake ciは、Kani、ファジング、Miriを、変更が及ぶところだけで実行します。変更を、それに依存するすべてのクレートまでたどり、前回合格してから入力が変わっていないチェックは飛ばします。make ci CI_SCOPE=fullは、キャッシュを使わずにそれらすべてを実行します。make kani、make fuzz、make pds-miriは、常に全体を実行します。

Kaniは、最もメモリを食うステップです。証明ジョブにはそれぞれ約10 GBのメモリが割り当てられ、KANI_JOBSで同時に実行する数を設定します。make kaniでメモリが足りなくなったら、Podmanの仮想マシンにもっとメモリを割り当てるか、KANI_JOBS=1を設定してください。