В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

ИСПРАВИТЬ: Неправильный машинный код генерируется для оператора «switch» в Visual C++ 2010 x 64 компилятора

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке: 2802711
Проблема
Предполагается, что компиляция C или C++ файл исходного кода для 64-разрядных двоичных файлов с помощью Visual C/C++ компилятор (Cl.exe) в Microsoft Visual Studio 2010. Файл исходного кода содержит функцию, которая использует оператор switch . В этом случае неправильные машинного кода могут создаваться для оператора switch , если выполняются следующие условия:
  • Включен параметр компилятора /Ob1 (Only_inline).
  • /o1/O1 (минимизировать размер), /o2/O2 (максимизировать скорость), /Ox (полная оптимизация) или параметра оптимизации компилятора /Og (виды глобальной оптимизации) включен.
  • Отключен параметр компилятора /GL (оптимизация всей программы).
Решение

Сведения об исправлении

Доступно исправление от корпорации Майкрософт. Тем не менее он предназначен для устранения проблемы, в данной статье. Предлагаемое исправление должно применяться исключительно в системах, в которых обнаружена эта специфическая неполадка.

Чтобы устранить эту проблему, обратитесь в службу поддержки пользователей Майкрософт для получения исправления. Полный список телефонов служб поддержки клиентов корпорации Майкрософт и сведения о стоимости поддержки посетите следующий веб-узел корпорации Майкрософт:Примечание В особых случаях оплата, предусмотренная службы для обращения в службу поддержки может быть отменена, если специалистом службы технической поддержки Майкрософт определяет, что обновление будет решением проблемы. Дополнительные услуги по технической поддержке, не связанные с данным исправлением, оплачиваются на стандартных условиях.

Необходимые условия

Данное исправление необходимо иметь Visual Studio 2010 Пакет обновления 1 (SP1 установлен).

Необходимость перезагрузки

Необходимо перезагрузить компьютер после установки данного исправления, если уязвимые файлы не используются. Рекомендуется закрывать компонентов, связанных с Visual Studio 2010, перед установкой исправления.

Сведения о файле

Общая версия данного исправления содержит атрибуты файла (или более поздние атрибуты файлов), приведенные в следующей таблице. Дата и время для этих файлов указаны в UTC. При просмотре сведений о файле, оно преобразуется в локальное время. Чтобы узнать разницу между временем по Гринвичу и местным временем, следует использовать Часовой пояс в закладке Дата и время элемент панели управления.
Имя файлаВерсия файлаРазмер файлаДатаВремяПлатформыPath
C2.dll16.0.40219.4442,606,71211 Марта числа 201319:24x86Microsoft Visual Studio 10.0\VC\bin
C2.dll16.0.40219.4442,493,56012 Марта числа 201316:48x86Microsoft Visual Studio 10.0\VC\bin\x86_amd64
C2.dll16.0.40219.4442,593,92812 Марта числа 201316:48x86Microsoft Visual Studio 10.0\VC\bin\x86_ia64
C2.dll16.0.40219.4442,960,50412 Марта числа 201316:48x64Microsoft Visual Studio 10.0\VC\bin\amd64

Дополнительная информация
Чтобы воспроизвести эту проблему, создайте исходный файл C или C++, содержащий следующий код:
#include <stdio.h>int test(int bps, int sflags){    if (sflags & (1 << bps))    {        switch (bps)        {        case 1:  return 1;        case 2:  return 3;        default: return 0;        }    }    else    {        switch (bps)        {        case 1:  return 2;        default: return 0;        }    }} void main(){    int res = test(1, -1);    printf("%d\n", res);}


Затем откройте Visual Studio x 64 кросс-инструменты командной строки или командной строки Visual Studio x 64 Win64 в Visual Studio 2010 и выполните компиляцию исходного файла с помощью следующей команды:
/Ob1 cl/O2 'Путь к файлу источника'

Ожидаемый результат: 1. Тем не менее фактический результат равен 0.
Статус
Данное поведение является подтвержденной ошибкой продуктов Майкрософт, перечисленных в разделе «Информация в данной статье применима к:».
Ссылки
Дополнительные сведения о параметре компилятора /Ob перейти на веб-сайте MSDN: Дополнительные сведения о параметре компилятора /GL посетите следующий веб-узел MSDN: Дополнительные сведения о параметрах оптимизации /O посетите следующий веб-узел MSDN:

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 2802711 — последний просмотр: 03/29/2013 08:56:00 — редакция: 3.0

Microsoft Visual Studio 2010 Service Pack 1, Microsoft Visual Studio 2010 Ultimate, Microsoft Visual Studio 2010 Professional, Microsoft Visual Studio 2010 Premium with MSDN

  • kbqfe kbhotfixserver kbfix kbsurveynew kbexpertiseadvanced kbmt KB2802711 KbMtru
Отзывы и предложения