CORREÇÃO: O código de máquina incorreto é gerado para uma instrução "switch" no Visual C++ 2010 x 64 compilador

Traduções deste artigo Traduções deste artigo
ID do artigo: 2802711 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Suponha que você compilar um arquivo de código fonte C ou C++ para um arquivo binário baseado em x64, usando o compilador do Visual C/C++ (Cl.exe) no Microsoft Visual Studio 2010. O arquivo código-fonte contém uma função que usa uma instrução switch . Nessa situação, o código de máquina incorreto podem ser gerado para a instrução switch se as seguintes condições forem verdadeiras:
  • A opção de compilador /Ob1 (Only_inline) está ativada.
  • O /O1 (minimizar tamanho), /O2 (maximizar velocidade), /Ox (otimização completa) ou opção de compilador de otimização /Og (otimizações globais) está habilitada.
  • A opção de compilador /GL (otimização de programa total) está desabilitada.

Resolução

Informações sobre hotfix

Agora há um hotfix com suporte da Microsoft. No entanto, destina-se a corrigir somente o problema descrito neste artigo. Aplique-o somente aos sistemas que apresentarem esse problema específico.

Para resolver esse problema, contate o Atendimento Microsoft para obter o hotfix. Para obter uma lista completa dos números de telefone do Atendimento Microsoft e informações sobre os custos de suporte, visite o seguinte site da Microsoft:
http://support.microsoft.com/contactus/?WS=support
Observação Em alguns casos, taxas cobradas pelas ligações para o suporte podem ser canceladas se um profissional de suporte da Microsoft determinar que uma atualização específica resolverá o problema. Os custos normais de suporte serão aplicados a perguntas de suporte adicionais e problemas que não se qualificam à atualização específica em questão.

Pré-requisitos

Para aplicar esse hotfix, você deve ter o Visual Studio 2010 Service Pack 1 (SP1) instalado.

Requisito de reinicialização

Não é necessário reiniciar o computador após aplicar este hotfix se os arquivos afetados que não estão sendo usados. Recomendamos que você feche componentes relacionados ao Visual Studio 2010 de antes de aplicar esse hotfix.

Informações sobre o arquivo

A versão global deste hotfix apresenta os atributos de arquivo (ou atributos de arquivo posteriores) listados na tabela a seguir. As datas e horas desses arquivos estão listadas em formato Tempo Universal Coordenado (UTC). Quando você exibir as informações do arquivo, ele é convertido em hora local. Para localizar a diferença entre o UTC e a hora local, use o Fuso horário Guia de Data e hora item no painel de controle.
Recolher esta imagemExpandir esta imagem
assets folding start collapsed
Recolher esta tabelaExpandir esta tabela
Nome do arquivoVersão do arquivoTamanho do arquivoDataHoraPlataformaCaminho
C2.dll16.0.40219.4442,606,71211-Mar-201319:24x86Microsoft Visual Studio 10.0\VC\bin
C2.dll16.0.40219.4442,493,56012 De março de 201316:48x86Microsoft Visual Studio 10.0\VC\bin\x86_amd64
C2.dll16.0.40219.4442,593,92812 De março de 201316:48x86Microsoft Visual Studio 10.0\VC\bin\x86_ia64
C2.dll16.0.40219.4442,960,50412 De março de 201316:48x64Microsoft Visual Studio 10.0\VC\bin\amd64
Recolher esta imagemExpandir esta imagem
assets folding end collapsed

Mais Informações

Para reproduzir esse problema, crie um arquivo de código-fonte C ou C++ que contém o código a seguir:

#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);
}


Em seguida, abra o Visual Studio x64 Cross Tools Command Prompt ou Prompt de comando do Visual Studio x64 Win64 no Visual Studio 2010 de e compilar o arquivo de origem, usando o comando a seguir:
cl /Ob1 /O2 'Caminho do arquivo de origem'

O resultado esperado é 1. No entanto, o resultado real é 0.

Situação

A Microsoft confirmou que este é um problema nos produtos Microsoft que estão listados na seção "Aplica-se a".

Referências

Para obter mais informações sobre a opção de compilador /Ob , vá para o seguinte site da MSDN:
Informações gerais sobre a opção de compilador /Ob
Para obter mais informações sobre a opção de compilador /GL , vá para o seguinte site da MSDN:
Informações gerais sobre a opção de compilador /GL
Para obter mais informações sobre as opções de otimização /O , vá para o seguinte site da MSDN:
Informações gerais sobre as opções de /O (otimizar o código)

Propriedades

ID do artigo: 2802711 - Última revisão: sexta-feira, 29 de março de 2013 - Revisão: 3.0
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Studio 2010 Service Pack 1
  • Microsoft Visual Studio 2010 Ultimate
  • Microsoft Visual Studio 2010 Professional
  • Microsoft Visual Studio 2010 Premium with MSDN
Palavras-chave: 
kbqfe kbhotfixserver kbfix kbsurveynew kbexpertiseadvanced kbmt KB2802711 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 2802711

Submeter comentários

 

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