netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2006-12-11 [長年日記] ▲
_ [論文] メモリアクセス違反を防ぐ ▲
C/C++におけるメモリアクセスに関する耐障害性について,Microsoft Research のBen Zornという人が喋りに来てました.私の研究にはまったく関係ないですが.
プログラムにパッチを当てるというのは管理やテストのコストが高くつくので,できればプログラムがエラーを起こしても自分で回復して実行を継続できるようにしたい,ということで研究をしているそうです.
この手法の対象としては単純にプログラミングエラーだけでなく,ハードウェアエラーによるデータ破壊とか,オンラインゲームのことも引き合いに出していました.特にオンラインゲームについては,キャラクターの所持金やアイテムが現実のお金と交換できるせいで,データ破壊の防止が重要になっていると指摘していました.
基本的なポインタエラーからの保護としては,malloc/free を差し替えて,バッファ領域の前後に余分な空間を持たせ,バッファ群を多重化し,レプリカごとにメモリ配置をランダムに変更する方法を取っていました(多数決でエラーを起こしたレプリカは捨てて,新たに領域を確保しなおすようです).メモリをかなり多めに使うので,適用先はある程度限定されるようですが,プログラムを書き換えずにそのまま実現できるという利点があります.
一方で,重要データの上書きを防止するために,"critical int" のようにソース上で修飾された変数の多重化を行っていました."critical store" という特別な命令によってのみ多重化されたコピー群をまとめて更新できるようにしておき,ポインタの操作ミス(または故意)でのデータ破壊が発生しても,"critical load" 命令によってコピーから値を復帰できるようにしています.
こちらの手法は,重要データの選び方にもよるようですが,実行時オーバーヘッドが10%程度で収まっていて,ランダムなメモリ書き換えが起きるような環境でもデータ破壊を防ぐことができた(最悪でも assertion などで停止した)ようです.
こういった手法は,CPUパワーとメモリを投資するほど安全性が向上するので,「メモリはあればあるだけ使ってしまう」状態が続きそうです.まあ,メモリが余ってても仕方ないので,余分にメモリを積んでいたら勝手に安全性向上,とかいう形になれば,それなりに嬉しいかもしれません.昔,PC-8801MHを使っていた頃は,PC-98シリーズなど,メモリを640kBも何に使うんだろうとか思ってたんですけどね…….