4E
あの日、NUSA報告 「ノヴァル
僕が確認したかったあの……
NUSA:『◆
これで僕の頭に浮かぶのは、無数のバケツが次から次へと現れて。「※警告!※ この先、スタックエリア外」と書かれた立札の並ぶ境界を超え、地平線の向こうへと
NUSA:『この電子スロットルシステムのCPUは、メモリ保護機能を有しておらず、スタック・オーバーフロー状態を正確に検知することはできない。とはいえ、そのようなオーバーフローが何らかのメモリ破損を引き起こして、それで何かよくない挙動を発生させ、ウォッチドッグ・タイマーのリセットにつながることはありそうである。』
つまり、例の「番犬くん」の出番だという。ふぅーん。
一方、原告側の専門家証人:マクシミリアン・バイエル氏の証言では……
A:『スタック・オーバーフローは、それ自体メモリー破損を引き起こしますので、まずやられるのは、4096バイトのスタック領域のすぐ隣にあるこの領域です。』
Q:『ここ……には、いったい何が?』
A:『ここにございますのはオペレーティングシステムのデータでして、保護されておりませんので。破損すれば、副作用としてタスクが死亡することもありえます。』
つまり、簡単に言うと。
溢れ出たバケツたちは、それぞれ、水が入っていたり/入っていなかったり……するわけだが、もともとその場所には。いちばん偉いオペレーティングシステム様のほうで、多数の
オペレーティングシステム様が、何か別の職務で一区切りついて。「どれ、こっちをやるとするかぁ?」と、バケツを引き上げたときにはもう。置いた時とは全然違う内容になってるのだ。そんな事象が、オペレーティングシステム様にとって良いことであるワケがない。とりわけ、例の巨大「キッチン・シンク」プログラム:スロットル開度を出力する「タスクX」を管理するためのバケツが、勝手に置き換わったりした日には……!
この点。「補遺A」を読む限り、NUSAは。「4096バイトのスタック領域のすぐ隣のバケツ置き場」が何に使われているか?……まで踏み込んでいないようだった。とはいえ、オーバーフローを凄っごく気にしていたのは間違いないようで。4096バイトを超えることが本当にないのか、算出しようとしていたのだ。
ところが、その前に立ちはだかったのは。
NUSA:『電子制御スロットルのコードは、人間が書いて実装したもので、モデルから生成したものではないため、ノヴァルのエンジニアにとって利用可能な分析の選択肢は、人力でのコードレビューしかなかったことに注意すべきである。そのうえ、再帰の存在により gstack や AbsIntStackAnalyzer のようなスタック処理ツールが駄目になることから、完全自動分析も使えない。』
障害となるのは、まさに当の「
ちなみにノヴァル側は「最大でも1688バイトまでしか使わない」とNUSAに報告していた。どうやって算出したのか? また、ほんとうにそうなら4096バイトものスタックエリアは過大ではないか?……と思うところだが。この報告値も、当の gstack で計測したものだったのだ。
NUSA:『この結果には注意が必要である。すなわち gstack は、そのユーザ・マニュアルにも:「プログラムに直接的・間接的再帰が潜在する場合には、再帰が何度生ずるか予測できないため、gstack はうまく機能できません。gstack は、呼び出しグラフに再帰の可能性を検知すると、警告メッセージを出力します。」……とあるように、再帰を解釈することができないのだ。』
gstack というのを僕自身使ったことがないのであれだが。たぶん……「再帰あり」と警告が出たときも、とりあえず「ループが生じなかった場合でバケツの数が最も多くなる予測値」を出してくる仕様のツールではなかろうか。「再帰」を考慮しなければ算出できるわけなので。逆に「再帰」があるとわかっているからこそ……
NUSA:『ノヴァルは余分な安全マージンを追加するため、スタック領域として4096バイトを割り当てたが、これは元の予測値の倍以上である。』
ところが、同様な予測値はバイエル証人も算出していて。「再帰」抜きでも、
Q:『貴方が発見したといわれる諸々を、概ね伺ってきたわけですが、この「スタック・ミステイク」というのは……どういうことでしょうか?』
A:『ノヴァルの大きな過ち……つまり、スタックエリアの最大利用率が41%としてしまった原因は、解析のやり方に間違いがあったことです。その一つは、オペレーティングシステム自身のスタックもあると気付いていなかったこと。もう一つは、350もの関数の分を見逃していたこと。これらを含むようにして、私どもで算出した最大値は94%です。これは「再帰」を考慮しておりませんので、スタック使用率はさらにこれを超える可能性があります。』
Q:『NUSAは、気づいていなかったのでしょうか?』
A:『はい、私はそのように考えております。安全マージンがほんの僅かであるとNUSAが気づくことはありませんでした。』
ウッ……と来るところだが、「
僕が構想して、父に「
「自分が、ある場合に、『手順A』を呼び出し」
↓
「その『手順A』が、ある場合に、『手順B』を呼び出し」
↓
「その『手順B』が、ある場合に、さらに自分を呼び出す」
……という、「間接再帰」タイプだったのだ。
しかも、NUSAとしては。ノヴァルの「間接再帰」よりも、僕がやらかした「自己再帰」のほうが、まだマシだと考えていたようなのだ。それというのも……
NUSA:『関節再帰のタイプは極めて
( i ) 間接再帰では通常、「再帰の循環」がいつ止むかを自動検出することはできず、それゆえ自動分析ツールで取り扱うことができない。このため、電制スロットルのような安全重要かつハード・リアルタイムなシステムに必要となる検証や妥当性検査は難しくなる。
( ii ) 間接再帰の呼び出し構造が自動ツールで扱うのに複雑すぎると、人間のプログラマにとっても、複雑すぎて完全に把握できないものとなるのが普通である。つまり、このような複雑さに対して手動解析は有効でない。
( iii ) 多重に入れ子となった再帰は、スタック空間を消耗し、メモリ破損やランタイム障害に繋がる可能性があるが、テストで検知するのは難しいかもしれない。
( iv ) 再帰は本質的にはループであり、どんなループとも同様、終了しない危険がある。無限のループはデッドロックにつながり、システムリセットを引き起こす可能性がある。』
このように、「コトの厄介さ」を強く訴える前置きをしたうえで。NUSAは、問題の「再帰」でつながる「基本手順」たちを、
………………
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。