2018年5月4日金曜日

安全なコードを書くための10のルール

デザインルールは大事。私がハードウェア開発出身だからかもしれないけど。

安全なコードを書くためのルール
Gerard J. Holzmann of the NASA/JPL Laboratory
https://en.wikipedia.org/wiki/The_Power_of_10:_Rules_for_Developing_Safety-Critical_Code


  1. gotoや再帰などの複雑なフロー構造は避ける
  2. 暴走しないように、すべてのループは最大値を設定する
  3. ヒープメモリ割り当てはしない
  4. 関数を1ページ以内に書く
  5. 関数ごとに最低2つのランタイムアサーションを使用
  6. データのスコープを可能な限り小さくする
  7. すべての非void関数の戻り値をチェックする。またはvoidにキャストして戻り値が役に立たないことを示す
  8. プリプロセッサは慎重に使用する
  9. ポインタの使用を1つの逆参照に限定し、関数ポインタは使用しない
  10. 考えられるすべての警告をアクティブにしてコンパイルする。ソフトウェアのリリース前にすべての警告を解決する。

1については、最近のプログラミング言語なら基本的にGOTO命令がないので自然に達成している。考えないといけないのはASMを使うときくらいだけど、だいたいASMを呼ぶときはワンショットのファンクションを書く時くらいだし、気にしなくていい

2の条件は、作るプログラムによっては厳しかったりする。たとえばこの条件を適用すると、JSONやXML、HTMLなどは扱えない

3はほぼ2と同意

4は可読性の問題?

5アサーション・・苦手・・

6はclassとか使っていればOK。

7は・・難しいね(w

8は全てのDEFINEで書いた関数をinline関数に置き換えれば。定数もconstで定義。

9複雑なポインタによる指定をしなければ大丈夫。

10warning潰しは割と楽しい

全てのプログラムでこの条件を完全に満足させることは出来ないけど、このチェックリストで何項目チェックできたかで、自分の書いたプログラムの安全性がチェックできますね。
私の書くソースコードはだいたい60点くらいでした。
HTMLやJavaScriptを扱う場合はどうしても20点ほど減点される。
Verilogを書く際は100点ですけど、この場合また別のデザインルールが発生します。

命にかかわるようなソースコードを書くことなんて滅多にないので、まぁ参考までに。


0 件のコメント:

コメントを投稿