NASAが定める安全クリティカルソフトウェア開発10のコーディングルール
大規模複雑ソフトウェアプロジェクトでは様々なコーディング標準・ガイドライン使用。これらガイドラインはソフトウェア記述時遵守必須の基本ルール確立。通常決定事項:
a) コード構造はどうあるべきか?
b) どの言語機能使用すべき/すべきでないか?
効果的ルールセットは小規模で、容易に理解・記憶可能な具体性必須。
NASAで働く世界トッププログラマーたちは、安全クリティカルコード開発ガイドライン遵守。実際NASAジェット推進研究所(JPL)等多機関がC言語コード重視。理由:ロジックモデル抽出器、デバッガ、安定コンパイラ、強力ソースコードアナライザー、メトリクスツール等、この言語への豊富ツールサポート存在。
クリティカルケースではこれらルール適用必須、特に人命が正確性・効率依存する場合。例:飛行機、宇宙船、原子力発電所制御ソフトウェア。宇宙機関がマシン運用に用いる標準ご存知ですか?以下、JPL主席科学者Gerard J. Holzmann定めるNASA 10コーディングルール列挙。全て主にセキュリティパラメータ焦点、他言語にも適用可能。
ルール1:シンプルな制御フロー
極めてシンプルな制御フロー構造でプログラム記述 - setjmp、longjmp構造、goto文、直接/間接再帰使用禁止。
理由: シンプル制御フローはコード明確性向上、検証能力強化。再帰なしで巡回関数呼び出しグラフなし。想定境界内実行が実際に境界内保証。
ルール2:ループの固定上限
全ループに固定上限必須。検証ツールでループ反復回数のプリセット上限超過不可能を静的に証明可能でなければならない。静的にループ上限証明不能ならルール違反。
理由: ループ上限存在・再帰不在で暴走コード防止。非終了意図反復(プロセススケジューラ等)には適用除外。逆ルール適用:反復終了不能を静的に証明必須。
ルール3:動的メモリ割当て禁止
初期化後、動的メモリ割当て使用禁止。
理由: malloc等メモリアロケータ、ガベージコレクタは予測不能振る舞い多く、性能に例外的影響。プログラマミスでメモリエラー発生も:物理利用可能超過割当試み、解放忘れ、解放後使用継続、割当境界超過。全モジュールを固定事前割当ストレージ領域内強制でこれら問題排除、メモリ使用検証容易化。ヒープ割当なし動的メモリ確保法:スタックメモリ使用。
ルール4:大規模関数禁止
標準参照フォーマット(1宣言1行、1文1行)で1枚紙に印刷可能長さ超過禁止。関数60行コード超え禁止。
理由: 過長関数は構造不良兆候。各関数は理解可能・検証可能な論理単位。コンピュータ画面複数画面跨ぐ論理単位理解極めて困難。
ルール5:最小アサーション密度
プログラムアサーション密度平均最低関数あたり2アサーション。アサーションは実環境実行時決して起こり得ない異常条件チェック用。ブールテスト定義必須。アサーション失敗時、明示的リカバリアクション実行必須。静的チェックツールでアサーション絶対失敗せず/絶対保持せず証明ならルール違反。
理由: 業界コーディング努力統計で単体テスト10-100行あたり最低1欠陥捕捉。アサーション密度増で欠陥検出確率上昇。アサーション使用は強力防御的コーディング戦略一部としても重要。関数事前/事後条件、パラメータ/戻り値、ループ不変条件検証用。パフォーマンスクリティカルコードテスト後選択的無効化可能。
ルール6:データオブジェクト最小スコープ宣言
データ隠蔽基本原則支持。全データオブジェクト、可能な最小スコープレベルで宣言必須。
理由: オブジェクトがスコープ外なら値参照・破損不能。複数非互換目的変数再利用抑制、故障診断複雑化防止。
ルール7:パラメータと戻り値チェック
非void関数戻り値、各呼び出し関数でチェック必須。パラメータ妥当性、各関数内部でチェック必須。厳格形式ではprintf文・ファイルclose文戻り値もチェック。
理由: エラー応答が成功応答と正当に異ならない場合、戻り値明示的チェック必須。close・printf呼び出し典型例。関数戻り値void明示的キャスト許容 - コーダーが意図的(非偶発的)に戻り値無視決定示唆。
ルール8:プリプロセッサ限定使用
プリプロセッサ使用、ヘッダーファイルインクルードとマクロ定義限定。再帰マクロ呼び出し、トークンペースティング、可変引数リスト禁止。標準ボイラープレート(同一ヘッダー多重インクルード回避)除き、1-2超条件付きコンパイル指令には正当化必要。大規模アプリ開発でも。各使用ツールベースチェッカーでフラグ必須、コード内正当化必須。
理由: Cプリプロセッサ強力・曖昧ツール、コード明確性破壊・テキストベースチェッカー混乱誘発。非制限プリプロセッサコード構造効果、形式的言語定義あっても極めて解読困難。条件付きコンパイル警告同等重要:条件付きコンパイル指令10個でコードバージョン1024通り(2^10)可能、テスト労力増大。
ルール9:ポインタ限定使用
ポインタ使用制限必須。1レベル超逆参照禁止。ポインタ逆参照操作をtypedef宣言やマクロ定義内隠蔽禁止。関数ポインタも禁止。
理由: ポインタ専門家でも誤用容易。ツールベース静的アナライザー特に、プログラムデータフロー追跡・分析困難化。関数ポインタも静的アナライザー実行チェックタイプ制限。強力正当化ない限り使用禁止。関数ポインタ使用時、再帰不在証明ツールほぼ不能、代替手法で分析能力損失補填必須。
ルール10:全コードコンパイル
開発初日から全コードコンパイル必須。コンパイラ警告、コンパイラ最厳格設定で有効化。これら設定で警告ゼロコンパイル必須。日次で最低1つ(望ましくは複数)最新静的ソースコードアナライザーで全コードチェック、警告ゼロで分析プロセスパス必須。
理由: 効果的ソースコードアナライザー市場多数、一部フリーウェア。コーダーがこの容易利用可能技術活用しない言い訳皆無。コンパイラ/静的アナライザー混乱時、混乱/エラー原因コード書き換え、より自明に妥当化必須。
産業技術
- 元素および高温超伝導体の臨界温度(ケルビン)
- 必須微分ルール:クイックリファレンス
- 基本的な原始関数ルール:定数、和、差
- BigStitcher:大規模3D組織イメージングをシンプルに
- より安全な未来を築く:スマート食品安全ソリューションの推進
- フリート近代化がコスト削減とサステナビリティ向上をもたらす理由
- コーディングを超えて:自動化プロジェクト成功のための鍵となるスキル
- UIDコンプライアンス完全攻略:DoDサプライヤーが遵守すべき3つの必須ルール
- 効果的なメンテナンスチェックリスト作成の4つの実証済み戦略
- 作業者と技術者のための包括的安全プロトコルを開発する
- 産業機械操作の安全性を守るトップ5実証済みプラクティス