4E

 日、NUSA報告 「ノヴァル意図せざる加速調査unintended acceleration investigation」を読み始めた夜のこと。

 僕が確認したかった……公判トライアルで陪審たちの目に触れたバイエル氏の引用箇所は。NTSAヌツァに提出されたうちの本編にはなかったのだが、「補遺A:ソフトウェア」のほうで見つかった。それは……


NUSA:『◆スタック・オーバーフローStack overflow・チェッカー。 このシステム・スタックは4096バイトに限定されているから、これを超えて実行されることはありえないと確認するのが重要だが、安全重要組込ソフトウェアにおける標準である「再帰処理無しthe absence of recursive procedures」の場合、やるべきチェックはシンプルである。』


 これで僕の頭に浮かぶのは、無数のバケツが次から次へと現れて。「※警告!※ この先、スタックエリア外」と書かれた立札の並ぶ境界を超え、地平線の向こうへと蔓延はびこっていくイメージだ。溢れ出たバケツたちは何をしでかすのか?「補遺A」には、こう書いてあった。


NUSA:『この電子スロットルシステムのCPUは、メモリ保護機能を有しておらず、スタック・オーバーフロー状態を正確に検知することはできない。とはいえ、そのようなオーバーフローが何らかのメモリ破損を引き起こして、それで何かよくない挙動を発生させ、ウォッチドッグ・タイマーのリセットにつながることはありそうである。』


 つまり、「番犬くん」の出番だという。ふぅーん。


 一方、原告側の専門家証人:マクシミリアン・バイエル氏の証言では……


A:『スタック・オーバーフローは、それ自体メモリー破損を引き起こしますので、まずやられるのは、4096バイトのスタック領域のすぐ隣にある領域です。』

Q:『ここ……には、いったい何が?』

A:『にございますのはオペレーティングシステムのデータでして、保護されておりませんので。破損すれば、副作用としてタスクが死亡することもありえます。』


 つまり、簡単に言うと。

 溢れ出たバケツたちは、それぞれ、水が入っていたり/入っていなかったり……するわけだが、もともとには。いちばん偉いオペレーティングシステム様のほうで、多数の仕事タスクを管理するためのバケツたちを置いているので。それらが、(ほんらい管理されてる側である)仕事タスクが新たに置いていくバケツへとしまうのである。

 オペレーティングシステム様が、何か別の職務で一区切りついて。「どれ、こっちをやるとするかぁ?」と、バケツを引き上げたときにはもう。置いた時とは全然違う内容になってるのだ。そんな事象が、オペレーティングシステム様にとって良いことであるワケがない。とりわけ、巨大「キッチン・シンク」プログラム:スロットル開度を出力する「タスクX」を管理するためのバケツが、勝手に置き換わったりした日には……!


 この点。「補遺A」を読む限り、NUSAは。「4096バイトのスタック領域のすぐ隣のバケツ置き場」が何に使われているか?……まで踏み込んでいないようだった。とはいえ、オーバーフローを凄っごく気にしていたのは間違いないようで。4096バイトを超えることが本当にないのか、算出しようとしていたのだ。

 ところが、その前に立ちはだかったのは。


NUSA:『電子制御スロットルのコードは、人間が書いて実装したもので、モデルから生成したものではないため、ノヴァルのエンジニアにとって利用可能な分析の選択肢は、人力でのコードレビューしかなかったことに注意すべきである。そのうえ、再帰の存在により gstack や AbsIntStackAnalyzer のようなスタック処理ツールが駄目になることから、完全自動分析も使えない。』


 障害となるのは、まさに当の「再帰recursion」……バケツを無限に置きまくる事態を起こし得る再帰recursionそのものであって。自動計測を封じられたNUSAは、各手順の絡まり合った状態をビジュアル化するツールの助けを借りながら、コードの動きを目で読み込んでいく羽目になったのだ。

 ちなみにノヴァル側は「最大でも1688バイトまでしか使わない」とNUSAに報告していた。どうやって算出したのか? また、ほんとうになら4096バイトものスタックエリアは過大ではないか?……と思うところだが。この報告値も、当の gstack で計測したものだったのだ。


NUSA:『この結果には注意が必要である。すなわち gstack は、そのユーザ・マニュアルにも:「プログラムに直接的・間接的再帰が潜在する場合には、再帰が何度生ずるか予測できないため、gstack はうまく機能できません。gstack は、呼び出しグラフに再帰の可能性を検知すると、警告メッセージを出力します。」……とあるように、再帰を解釈することができないのだ。』


 gstack というのを僕自身使ったことがないのであれだが。たぶん……「再帰あり」と警告が出たときも、とりあえず「ループが生じなかった場合でバケツの数が最も多くなる予測値」を出してくる仕様のツールではなかろうか。「再帰」を考慮しなければ算出できるわけなので。逆に「再帰」があるとわかっているからこそ……


NUSA:『ノヴァルは余分な安全マージンを追加するため、スタック領域として4096バイトを割り当てたが、これは元の予測値の倍以上である。』


 ところが、同様な予測値はバイエル証人も算出していて。「再帰」抜きでも、被告ノヴァルへ突き刺さる一撃を放っていた。それは……


Q:『貴方が発見したといわれる諸々を、概ね伺ってきたわけですが、この「スタック・ミステイク」というのは……どういうことでしょうか?』

A:『ノヴァルの大きな過ち……つまり、スタックエリアの最大利用率が41%としてしまった原因は、解析のやり方に間違いがあったことです。その一つは、オペレーティングシステム自身のスタックもあると気付いていなかったこと。もう一つは、350もの関数の分を見逃していたこと。これらを含むようにして、私どもで算出した最大値は94%です。これは「再帰」を考慮しておりませんので、スタック使用率はさらにこれを超える可能性があります。』

Q:『NUSAは、気づいていなかったのでしょうか?』

A:『はい、私はそのように考えております。安全マージンがほんの僅かであるとNUSAが気づくことはありませんでした。』


 ウッ……と来るところだが、「再帰recursion」の話に戻ろう。


 僕が構想して、父に「再帰recursionだ」と指摘された「迷路の抜け方」は。「基本手順」にしたがって自キャラを動かしている最中に、さらに「基本手順」を始めるような「自分で自分を呼び出す」ものだったが。ノヴァル・キャブラの電子スロットル制御ソフトウェアの3か所で(!)NUSAが発見した「再帰recursion」は。いずれもそういう「自己再帰」タイプではなく、


「自分が、ある場合に、『手順A』を呼び出し」

 ↓

「その『手順A』が、ある場合に、『手順B』を呼び出し」

 ↓

「その『手順B』が、ある場合に、さらに自分を呼び出す」


……という、「間接再帰」タイプだったのだ。


 しかも、NUSAとしては。ノヴァルの「間接再帰」よりも、僕がやらかした「自己再帰」のほうが、だと考えていたようなのだ。それというのも……


NUSA:『関節再帰のタイプは極めてまれであるが、それは以下の理由による:

( i ) 間接再帰では通常、「再帰の循環」がいつ止むかを自動検出することはできず、それゆえ自動分析ツールで取り扱うことができない。このため、電制スロットルのような安全重要かつハード・リアルタイムなシステムに必要となる検証や妥当性検査は難しくなる。

( ii ) 間接再帰の呼び出し構造が自動ツールで扱うのに複雑すぎると、人間のプログラマにとっても、複雑すぎて完全に把握できないものとなるのが普通である。つまり、このような複雑さに対して

( iii ) 多重に入れ子となった再帰は、スタック空間を消耗し、メモリ破損やランタイム障害に繋がる可能性があるが、テストで検知するのは難しいかもしれない。

( iv ) 再帰は本質的にはループであり、どんなループとも同様、終了しない危険がある。無限のループはデッドロックにつながり、システムリセットを引き起こす可能性がある。』


 このように、「コトの厄介さ」を強く訴える前置きをしたうえで。NUSAは、問題の「再帰」でつながる「基本手順」たちを、宇宙あま駆ける超技術力を駆使して解析し尽くし、実際にはスタック・オーバーフローを起こさないのであると。みごと、確認していくことになる………



 ………………ハズだった、のだが。

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る