MISRA-C の思ひ出(または「守られないルールはルール自体に問題がある」)
オンライン開催お疲れさまでした
2021-04-21 に開催された Go Conference 2021 Spring は初のオンラインだったそうで,週末の土曜日ということもあって,出不精で人見知りな私でも気軽に参加できたのがありがたかった。 (リアルタイム視聴も含めて)動画や音声のコンテンツはまとまった時間で拘束されてしまうのであまり好きではないのだが,たまにはこういうものに参加するのもよろしかろう。
そのなかのひとつである
は興味深く視聴させてもらった。 特に go-ruleguard は面白そうだ。 個人でも使う機会があるかもしれない。
ちなみに,スライドにも書かれているが, gosec は golangci-lint にも組み込まれているので
$ golangci-lint run --enable gosec ./...
といった感じに使うことができる。
MISRA-C の思ひ出
この発表を視聴しながら思い出していたのは大昔に車載系のプロジェクトに参加したときのことだ。 あのときはアセンブラでベクタテーブルからゴリゴリ書いてたよなぁ(遠い目)
今は違うと思うが,当時は MISRA-C というガイドラインがあって,これが車載系における事実上の C 言語コーディング基準(criteria)になっていた。
詳細は割愛するが, MISRA-C には127個のルールがあって「必要(Required)」と「推奨(Advisory)」のいずれかに分類されている。 このうち「必要」ルールは強制的に課せられるルールで,このルールからの逸脱(deviation)を許容する場合には,手続きを踏んで文書化と承認を行わなければならない。 各ルールにはルールの詳細(何故そのルールが必要か)と逸脱可否の判断基準とサンプルコードが載っているので,それを参考に逸脱の可否を判定する。
MISRA-C が定めるルール自体は合理的な内容なのだが,127個ものルールを机上でチェックするのは不毛なので MISRA-C 対応の lint ツールを使うことになる(当時はこれがバカ高くてねぇ)。 で,当然ながら lint ツールは製品の差別化のために MISRA-C 以外のルールもチェックできるようになっていて,最終的に数百ものルールをチェックすることになる。
守られないルールはルール自体に問題がある
問題は lint を実施した結果,大量の警告が出た場合である。 あるルールについて大量の逸脱が発生する理由は大きく2つある。
- プログラム設計が根本的に間違っている
- ルールが間違っている
プログラマのスキルによるかもしれないが,経験上こういうときに前者が理由であることはほとんどない。 なので,まずは「ルールが間違っている」のではないかと疑ってみるのが定石である。
基本的に「ルールは守られるべきもの」であるが,ルールもまた人間が考えたものであり,間違っている可能性を常に考慮すべきである。 何故なら人間は間違いを犯す生き物なのだから。
私は「悪法も法」という考え方には与しない。 「悪法は悪法」であり正すべきだ。 そして「悪法」の判断基準のひとつが「守られないルールはルール自体に問題がある」である。 ルールもリファクタリングの対象となる「コード」なのだ。
最初に挙げた発表では reviewdog を使って変更部分のみチェックする方法が紹介されていたが, reviewdog を常用するのは個人的にお勧めできない。 これが常態化すると「動いてるコードは触るな」という方向に行きがちで,それによってリファクタリングの機会を失うこととなり,最終的に技術的負債の返済が遅れることになる。 リファクタリングに厚いのが Go の持ち味なので,これを抑圧するような運用は避けるべきだろう。
ことほど左様にルール・メイキングというのは難しいのである。 できるなら,煩わしいことは機械に任せて楽しくコードを書きたいものである。
ブックマーク
参考図書
- 組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド
- MISRA‐C研究会 (編集)
- 日本規格協会 2006-10-01
- 単行本
- 4542503461 (ASIN), 9784542503465 (EAN), 4542503461 (ISBN)
- 評価
私が持っているのはこれよりひとつ古い版だが,まぁいいか。むかし,車載用の組み込みエンジニアをやっていた頃は必読書として読まされました。今はもっと包括的な内容のものがあるはず。
- CODE VERSION 2.0
- ローレンス・レッシグ (著), 山形浩生 (翻訳)
- 翔泳社 2007-12-19 (Release 2016-03-14)
- Kindle版
- B01CYDGUV8 (ASIN)
- 評価
前著『CODE』改訂版。