Симптомы
Используйте параметр компилятора /Ot (приоритет быстрого кода) при построении приложения, настроенного на x64 платформу в Microsoft Visual Studio 2005 Пакет обновления 1 (SP1). При запуске приложения, некоторые операторы if может работать неправильно. Таким образом результаты будут непредсказуемыми. Например Если инструкции могут быть пропущены в созданном коде приложения.
Эта проблема возникает только в следующей ситуации.
-
Существуют некоторые инструкции MOV между двумя операциями сравнения.
-
Это сравнение использования операций теми же операндами.
-
С помощью инструкции MOV изменяются значения операндов.
В этом случае операторы if в второй операции сравнения могут быть пропущены.
Примечания
-
Эта проблема может возникать при использовании параметра/O2 или /Ox для построения приложения.
-
Эта проблема не возникает на x86 платформы.
Причина
Эта проблема возникает из-за оптимизации компилятора ошибочно предполагает, что флаг, который задается с помощью операции XOR может использоваться без включения операции сравнения.
Решение
Сведения об исправлении
Существует исправление от корпорации Майкрософт. Однако данное исправление предназначено для устранения только проблемы, описанной в этой статье. Применяйте это исправление только в тех случаях, когда наблюдается проблема, описанная в данной статье. Это исправление может проходить дополнительное тестирование. Таким образом если вы не подвержены серьезно этой проблеме, рекомендуется дождаться следующего пакета обновления, содержащего это исправление.
Если исправление доступно для скачивания, имеется раздел "Пакет исправлений доступен для скачивания" в верхней части этой статьи базы знаний. Если этот раздел не отображается, обратитесь в службу поддержки для получения исправления.
Примечание. Если наблюдаются другие проблемы или необходимо устранить неполадки, вам может понадобиться создать отдельный запрос на обслуживание. Стандартная оплата за поддержку будет взиматься только за дополнительные вопросы и проблемы, которые не соответствуют требованиям конкретного исправления. Чтобы получить полный список телефонов поддержки и обслуживания клиентов корпорации Майкрософт или создать отдельный запрос на обслуживание, посетите следующий веб-сайт корпорации Майкрософт:
http://support.microsoft.com/contactus/?ws=supportПримечание. В форме "Пакет исправлений доступен для скачивания" отображаются языки, для которых доступно исправление. Если нужный язык не отображается, значит исправление для данного языка отсутствует.
Предварительные условия
Visual Studio 2005 с Пакетом обновления 1 для установки этого исправления необходимо иметь.
Необходимость перезагрузки
Не требуется перезагружать компьютер после установки данного исправления.
Сведения о замене исправлений
Это исправление не заменяет других исправлений.
Сведения о файлах
Английская версия данного исправления содержит атрибуты файла (или более поздние атрибуты файлов), приведенные в следующей таблице. Дата и время для этих файлов указаны в формате общего скоординированного времени (UTC). При просмотре сведений о файле, он преобразуется в локальное время. Чтобы узнать разницу между временем по Гринвичу и местным временем, откройте вкладку Часовой пояс элемента Дата и время в панели управления.
Имя файла |
Версия файла |
Размер файла |
Дата |
Время |
Платформа |
---|---|---|---|---|---|
C2.dll |
14.0.50727.3080 |
2,273,280 |
19 ноября 2008 г. |
18:52 |
x86 |
C2.dll |
14.0.50727.3080 |
7,192,576 |
19 ноября 2008 г. |
23:25 |
IA-64 |
C2.dll |
14.0.50727.3080 |
2,490,368 |
19 ноября 2008 г. |
23:26 |
x86 |
C2.dll |
14.0.50727.3080 |
3,600,384 |
19 ноября 2008 г. |
23:33 |
x64 |
C2.dll |
14.0.50727.3080 |
2,203,648 |
19 ноября 2008 г. |
23:33 |
x86 |
Временное решение
Чтобы обойти эту проблему, воспользуйтесь одним из следующих методов:
-
Используйте ключевое слово volatile при объявлении переменных, используемых в инструкции if .
-
Отключите параметр оптимизации скорости. Например замените параметр /Ot параметр /Os (приоритет размера кода) . Или используйте параметр/O1 вместо параметра/O2 или /Ox .
-
Добавьте строку кода до операции сравнения операторы if в секунду. Например добавьте оператор printf .
Статус
Корпорация Майкрософт подтверждает, что это проблема продуктов Майкрософт, перечисленных в разделе "Относится к".
Дополнительные сведения
Дополнительные сведения о коде одного или нескольких, операторы могут работать некорректно при использовании функции оптимизации кода в Visual Studio 2005 щелкните следующий номер статьи базы знаний Майкрософт:
925792 один или несколько операторов кода могут работать некорректно при использовании функции оптимизации кода в Visual Studio 2005
Для получения дополнительных сведений о терминологии обновлений программного обеспечения щелкните следующий номер статьи базы знаний Майкрософт:
Описание 824684 Стандартные термины, используемые при описании обновлений программных продуктов Майкрософт