現象
X64 で構成されているアプリケーションをビルドするときに、 /Ot (実行速度の優先高速なコード)コンパイラ オプションを使用する Microsoft Visual Studio 2005 Service Pack 1 (SP1) のプラットフォームです。アプリケーションを実行すると、 ifステートメントは、いくつか可能性があります正常に動作しません。したがって、結果は予測できません。などのアプリケーションの生成されたコード内のifステートメントをスキップ可能性があります。
この問題は、次のシナリオでのみ発生します。-
2 つの比較操作の間には、いくつか MOV 命令があります。
-
これらは、操作の使用に、同じオペランドを比較します。
-
MOV 命令のオペランドの値が変更されます。
このシナリオでのifステートメントは 2 つ目の比較操作ではスキップされます可能性があります。
注:-
/O2オプションまたは/Oxオプションを使用するアプリケーションをビルドするとき、この問題を発生も可能性があります。
-
X86 でこの問題は発生しないプラットフォームです。
原因
コンパイラのオプティマイザーは、比較操作を含めずに XOR 演算によって設定されたフラグを使用できることと誤った前提であるために、この問題が発生します。
解決策
修正プログラムの情報
サポートされている修正プログラムは、マイクロソフトから入手可能です。ただし、この修正プログラムは、ここで説明する問題のみを修正することを目的としたものです。この修正プログラムは、この資料に記載された問題があったシステムのみに対して適用してください。この修正プログラムは、今後さらにテストを行う場合があります。したがって、この問題の影響が深刻でない場合は、この修正プログラムが含まれる次のソフトウェア更新プログラムがリリースされるまで待つことをお勧めします。
修正プログラムをダウンロードできる場合は、このサポート技術情報の資料の上部に「修正プログラムのダウンロード」セクションがあります。このセクションが表示されていない場合は、マイクロソフト カスタマー サービス サポートにお問い合わせのうえ、修正プログラムを入手してください。 注: さらなる問題が発生した場合、またはトラブルシューティングが必要な場合には、別のサービス リクエストの作成が必要な場合があります。この修正プログラムの対象外の追加の質問および問題については、通常のサポート料金が適用されます。マイクロソフト カスタマー サービス サポートの電話番号一覧または別のサービス リクエストの作成については、次のマイクロソフト Web サイトを参照してください。http://support.microsoft.com/contactus/?ws=support注: [修正プログラムのダウンロード] フォームには、修正プログラムが提供されている言語が表示されます。お使いの言語が表示されない場合は、その言語の修正プログラムが利用できないためです。
必要条件
この修正プログラムを適用するのにはインストールされている Visual Studio 2005 SP 1 が必要です。
再起動の必要性
この修正プログラムの適用後にコンピュータを再起動する必要はありません。
修正プログラムの置き換えに関する情報
この修正プログラムによって他の修正プログラムが置き換わることはありません。
ファイル情報
修正プログラム (英語版) のファイル属性は次表のとおりです。ただし、これより新しい修正プログラムがリリースされている可能性もあります。各ファイルの日付および時刻は、世界協定時刻 (UTC) で示されています。ファイル情報に表示される時刻は、ローカル時刻に変換されています。UTC とローカル時刻との時差を確認するには、コントロール パネルの [日付と時刻] の [タイム ゾーン] タブを使用してください。
ファイル名 |
ファイル バージョン |
ファイルのサイズ |
日付 |
時刻 |
プラットフォーム |
---|---|---|---|---|---|
C2.dll |
14.0.50727.3080 |
2,273,280 |
2008 年 11 月 19 日 |
18:52 |
x86 |
C2.dll |
14.0.50727.3080 |
7,192,576 |
2008 年 11 月 19 日 |
23:25 |
IA-64 |
C2.dll |
14.0.50727.3080 |
2,490,368 |
2008 年 11 月 19 日 |
23:26 |
x86 |
C2.dll |
14.0.50727.3080 |
3,600,384 |
2008 年 11 月 19 日 |
23:33 |
x64 |
C2.dll |
14.0.50727.3080 |
2,203,648 |
2008 年 11 月 19 日 |
23:33 |
x86 |
回避策
この問題を回避するには、以下のいずれかの方法を使用します。
-
Ifステートメントで使用される変数を宣言するときは、volatile キーワードを使用します。
-
速度の最適化オプションを無効にします。たとえば、 /Os (小さなコードを優先)オプションを使用して、 /Otオプションを交換してください。または、 /O2オプションまたは/Oxオプションではなく、 /O1オプションを使用します。
-
2 番目のifステートメントは、比較操作の前に、コード行を追加します。たとえば、 printfステートメントを追加します。
状況
マイクロソフトは、この問題を「対象製品」セクションに記載されているマイクロソフト製品の問題として認識しています。
詳細
ステートメントが正しく実行されない Visual Studio 2005 でコードの最適化機能を使用すると 1 つまたは複数のコードの詳細については、マイクロソフト サポート技術情報の資料を参照するのには次の資料番号をクリックします。
925792 1 つまたは複数のコード ステートメントが正しく実行されない Visual Studio 2005 でコードの最適化機能を使用する場合 ソフトウェア更新プログラムの用語の詳細については、次の文書番号をクリックして、マイクロソフト サポート技術情報の資料を参照してください。
824684マイクロソフトのソフトウェア更新プログラムを記述するために使用される一般的な用語説明