2011-07-07 12 views
9

MSVC++ 2010で/GS(バッファセキュリティチェックを有効にする)をコンパイルするとランタイムパフォーマンスに無視できない影響を及ぼすようになったことに、 。誰にもこの経験がありましたか?MSVC++の "Buffer Security Check/GS"コンパイラオプションの理解

大きな科学的スタイルのアプリケーション(メッシュ生成ライブラリ)の場合、/GS-でコンパイルすると、テストスイートのいくつかの大きなベンチマークで実行時間がほぼ10% =ランタイムの1秒分)。 /GSは、MSVC++ 2010のすべての最適化レベルでデフォルトでオンになっています。

私はこれまであまり注目を払っていなかったことを認めなければなりません。 。オンラインdocumentationは、ストリングバッファーについて広範に話しているようですが、stringまたはchar[]バッファーを使用しないため、何かが欠けているはずです。 (オンラインドキュメントから)

この段落は、私が見ているパフォーマンスの低下は少し珍しいであることを示しているようだ:

アプリケーションで セキュリティチェックを使用するため、パフォーマンスのトレードオフが なされなければなりません。 Visual C++コンパイラチーム はパフォーマンスを小さくすることに重点を置いていました。 ほとんどの場合、 のパフォーマンスは2%より多く低下することはありません。 実際には、 の経験では、高性能サーバーを含む アプリケーションのほとんどが パフォーマンスに影響していないことがわかりました。

もちろん、私はそれをオフにしてより速いコードを得ることができますが、私がそれをする前にその意味を理解したいと思います。

+2

「ハイパフォーマンス・サーバー・アプリケーション」を含む多くのコードがありますが、I/Oバウンドまたはメモリにバインドされています。余分な小切手を挿入することは、そのようなコードでは実質的に無料です。 – MSalters

+0

Michael Howardには、Brayの2002年の記事以降に/ GSサポートに追加されたもののいくつかが記載されています。http://msdn.microsoft.com/en-us/magazine/cc337897.aspx –

答えて

11

/GSでは、関数の実行中に書き込みオーバーランなどのスタック攻撃が発生したことを検出し、書き込みオーバーラン後に実行を停止しようとするコードを追加します。見つけようとしているパターンは、実際の攻撃で見られたパターンです。当時の/ GSがその時点で使用されていれば、実際には起こらなかったセキュリティ情報がたくさんあります。

この場合、構造体、配列、その他のさまざまなエンティティで書き込みオーバーランが発生する可能性があります。 VSの各バージョンでは、/ GSの変更と改善が行われています。より多くの/ GS保護は一般的にコストがかかりますが、新しいVSは同じ保護をより安価に行う方法を学んでいるかもしれません。

あなたのコードが他の人に出荷されない限り、/ GSを残すことをおすすめします。多くの場合、他の方法でプログラムの最も重要な部分を手で最適化する場合と同様に、リスクや影響がない特定の機能に対しては無効にすることもできます。

マーティン

+0

/は '/ GS'を使ってすべてのスタックベースのバッファ上で行うことができます。私は、 '' char [] 'バッファーについて話しているオンラインの医者によって少し混乱しています。 –

+0

これらの小切手は、小切手のコスト/便益に応じて、さまざまな種類に適用されます。ヒューリスティックが適用され、時間とともに更新されます。ドキュメントはcharについてよく話しますが、それはBOの最もよく知られた種類ですが、実際のセキュリティ上の問題は他のオーバーフローによるものです。 –

+0

/GSオプションは、バグであるバッファオーバーラン、つまりプログラマーの不具合を発見することを目的としていますか、攻撃に対するセキュリティは唯一の問題ですか? –

12

私はあなたと同じ経験をしました:/ GS-は、ランタイムで約10%の改善につながります。 The Cost of Buffer Security Checks in Visual C++

/GSが有効になっていると(VC++リリースの設定のデフォルト)、Cスタイルの配列をローカル変数として作成すると、コンパイラはスタック上の配列に続く4バイトが変更されていないことを確認するために、いくつかの追加の命令を挿入してください。あなたが気づいたように、それがchar配列か、別の型の配列かどうかは関係ありません。私は、このコンパイラオプションの背後にあるアイディアは、スタックバッファのオーバーフローがタイプにかかわらずハッカーによって悪用される可能性があると考えています。

しかし、ネットワークサービスではないビジュアルC++アプリケーションを開発していて、ゲームやエディタ、ベンチマークツールなどのパフォーマンスを最大限に高めようとしている場合は、ハッカーのターゲットになる可能性は低い - 次に、このオプションを無効にすることをお勧めします。

関連する問題