これについても簡単なサンプル・プログラムを作って調べてみた。Windows XP SP2のコンパイルに使われているVisual C++のバージョンは不明だが,Visual C++.NET 2003やVisual C++ 2005(ベータ1)と大差ないだろう(SP2のプログラムを逆アセンブルすることはしていない)。

 結果は,「/GS」オプションを付けないときに比べると,オプションを付けたときは約1%遅くなる程度だった。サンプル・プログラムは関数内のステップ数が少なく,相対的にカナリヤ値のチェックに要する時間が長くなるのにこの程度ならば,実運用上は問題なかろう。

 Visual C++.NET 2003とVisual C++ 2005が生成したアセンブリ・コードを見比べてみると,若干違いがあったが,実行速度の上では大差ないものだった。また,関数内で配列を取ったときだけカナリヤ値を調べるコードが生成されたので,バッファ・オーバーフローの危険がない関数の実行速度は変わらないはずだ。

SP2のDEP設定画面には注意

図2●Windows XP Service Pack 2で新設されたDEPのための設定画面
Athlon 64搭載PCでService Pack 2を適用したWindows XPを動かしたときのものである。
 Windows XP SP2にはDEP用の設定画面が新たに設けられた。[システムのプロパティ]-[パフォーマンス]-[データ実行防止]である(図2[拡大表示])。この設定画面を使うことによって,上記のようなDEPの副作用は,ある程度防げる。

 DEPの設定画面には2つのオプションが用意されている。(1)「重要なWindowsのプログラムおよびサービスについてのみ有効にする」,(2)「次に選択するものを除くすべてのプログラムおよびサービスについてDEPを有効にする」,である。

 (1)のオプションを選択すると,そこに書かれている通り,DEPはWindowsのシステム・プログラムのみに対して有効になる。ユーザー・プログラムには効かないので,データ領域でわざとプログラムを実行するようなコードを書いてもそのまま動く。

 ここで,「Windowsのシステム・プログラム」とは,どの範囲を指すのか疑問に思うかもしれない。これは,Windowsが内部に持っているリストに書かれたプログラムである。何が書かれているかは公開されておらず不明だが,Internet Explorerが対象外になっていることは,次の(2)のオプションを選んだときに出たDEPの警告ダイアログが,(1)のオプションにすると出なくなったことから確かめられた。

 (2)のオプションを選択すると,すべてのプログラムがDEPの対象となる。ただし,DEPの対象外にするプログラムを例外リストに登録しておくことができる。

 これら2つのオプションは,C:\boot.iniに書かれるWindows XPの起動パラメータに相当する。(1)は「/noexecute=OptIn」,(2)は「/noexecute=OptOut」である(オプションがRC2版とは違うので注意)。実際には,DEPのオプションはこれ以外にも,DEPを完全に無効にする「/noexecute=AlwaysOff」と,例外なくDEPを有効にする「/noexecute=AlwaysOn」の合計4種類が用意されている。