Failure-oblivious computing(エラー忘却型コンピューティング)は、Cのような非安全言語で生じる境界外アクセスや無効ポインタ参照があっても、プロセスを落とさず“継続実行”させるためのランタイム/コンパイラ技法です。2004年のOSDIでRinardらが提案し、無効書き込みは破棄・無効読み出しは「合成値」を返すことで、アドレス空間の破壊を防ぎつつ通常の制御フローに復帰させます。英語版Wikipediaでも、典型的なメモリチェッカー(検出→例外/中止)と対照的に「製造値で続行」する点が要点として整理されています。 USENIXWikipedia
仕組みは「安全C(safe-C)コンパイラ」が動的境界チェックを挿入し、失敗時の“継続コード”に置き換えるもの。具体的には、無効書き込みを捨ててデータ汚染の局所化を図り、無効読み出しには小整数列などの合成値を用いて無限ループの誘発を避けます(例:Midnight Commanderの‘/’探索ループを止めるため、戻り値に‘/’が含まれる列を用意)。これにより、致命的例外を起こさず次の要求処理へ進めるようにします。 USENIX
拡張として「Boundless Memory Blocks(境界無限化)」があり、境界外書き込みをハッシュテーブルに退避し、後の境界外読みで対応値を返す方式を採用します。これによりサイズ計算ミスがあっても論理の意味をより保ちやすくなる一方、退避領域の上限管理(LRU等)が課題です。Rinardらは他にも「同一データ単位へのオフセット折返し」などのバリアントを実装しています。 USENIXMIT CSAIL
評価では、Apache/Sendmail/Pine/Mutt/Midnight Commander等の既知脆弱性入力に対し、脆弱性の悪用(スタック破壊など)を封じつつサービスを継続できることを示しました。性能面は動的チェックの導入に依存し、過去研究と整合的に「通常は2倍未満の低下、場合により8〜12倍」という幅が報告されています。概説的なまとめでは「80〜500%増」(=約1.8〜6倍)とする表現もあります。用途・パスによるばらつきが大きく、ワークロード基準での検討が不可欠です。 USENIXWikipedia
有効に働く条件は「エラー伝播距離が短い」系、典型的には要求単位で独立しやすいサーバ処理です。書き込み破棄でデータ破壊を局所化し、読みの合成値で例外を回避すれば、次リクエストには影響が及びにくい。一方、単一誤りが大域に波及する数値計算などには不向きで、開発時(落として原因同定すべき局面)にも適しません。この発想は“受容性指向コンピューティング(acceptability-oriented)”に位置づけられ、厳密な正しさよりも「実行継続と可用性」を優先する設計判断といえます。 USENIX
利点は(1)可用性の向上(落ちない)(2)バッファオーバラン系攻撃の無力化(書き込みを無効化)(3)導入コストが低い(再コンパイル中心)。一方で、(a)想定外パスへ入る危険(意味論の揺らぎ)(b)“バイスタンダー効果”による開発品質低下(直せるのに直さない心理)(c)不具合の不可視化、などの副作用があります。そのためログ出力や運用時限定適用など、エラー可視化と開発プロセスの分離が推奨されます。後続研究には、バイナリ計装で致命的エラーから回復して影響範囲を追跡・封じ込める“Recovery shepherding”(PLDI 2014)や文脈依存の失敗忘却戦略の探索などがあり、同系統の「落とさない」耐障害化技法として発展しています。 USENIXWikipedia
総じて、Failure-obliviousは“正しさ<継続”を明示的に選ぶ場面で威力を発揮します。SLA重視のオンライン系やバッチ大規模処理での一時的ガード、未知入力に晒されるレガシーCコードの延命措置などが主戦場です。逆に、数値品質や再現性が不可欠な領域、検証可能性・説明責任が強く問われる領域では、静的解析や型安全言語、形式手法/フェイルファスト運用と組み合わせ、採用可否を慎重に設計してください。 USENIX