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

Переводы статьи Переводы статьи
Код статьи: 2802711 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Проблема

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

Решение

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

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

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

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

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

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

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

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

Общая версия данного исправления содержит атрибуты файла (или более поздние атрибуты файлов), приведенные в следующей таблице. Дата и время для этих файлов указаны в UTC. При просмотре сведений о файле, оно преобразуется в локальное время. Чтобы узнать разницу между временем по Гринвичу и местным временем, следует использовать Часовой пояс в закладке Дата и время элемент панели управления.
Свернуть это изображениеРазвернуть это изображение
assets folding start collapsed
Свернуть эту таблицуРазвернуть эту таблицу
Имя файлаВерсия файлаРазмер файлаДатаВремяПлатформы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
Свернуть это изображениеРазвернуть это изображение
assets folding end collapsed

Дополнительная информация

Чтобы воспроизвести эту проблему, создайте исходный файл 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:
Общие сведения о /Ob-параметр компилятора
Дополнительные сведения о параметре компилятора /GL посетите следующий веб-узел MSDN:
Общие сведения о параметра компилятора/GL.
Дополнительные сведения о параметрах оптимизации /O посетите следующий веб-узел MSDN:
Общие сведения о параметры /O (оптимизация кода)

Свойства

Код статьи: 2802711 - Последний отзыв: 29 марта 2013 г. - Revision: 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
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: 2802711

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com