Sintomas

Considere o seguinte cenário.

  • Criar uma aplicação que carrega um byte de uma estrutura ou de uma classe no Microsoft Visual Studio 2008 Service Pack 1 (SP1).

  • Activar a opção de optimização de /Ox ou a opção de optimização de /O2 .

  • Compilar a aplicação utilizando uma configuração de lançamento para o x64 plataforma.

Neste cenário, o deslocamento que é gerado para aceder ao membro da estrutura ou o membro de classe está incorrecto.Este problema ocorre apenas quando o tamanho da estrutura e o desfasamento ou o tamanho de classe e o desvio igual a um dos seguintes pares:

  • (14,13)

  • (15,13)

  • (22,21)

  • (23,21)

  • (30,29)

  • (31,29)

Resolução

Informações sobre correção

Agora tem uma correcção suportada disponível na Microsoft. Contudo, destina-se apenas a corrigir o problema descrito neste artigo. Aplique-a apenas em sistemas que tenham este problema específico. Esta correcção poderá ser submetida a testes adicionais. Por conseguinte, se não estiver a ser gravemente afectado por este problema, recomendamos que aguarde pelo próximo service pack do Visual Studio 2008 que contenha esta correcção.Para resolver este problema imediatamente, contacte o suporte técnico da Microsoft para obter a correcção. Para obter uma lista completa dos números de telefone do suporte técnico da Microsoft e informações sobre os custos de suporte, visite o seguinte Web site da Microsoft:

http://support.microsoft.com/contactus/?ws=supportNota Em casos especiais, os custos normalmente inerentes às chamadas de suporte poderão ser anulados se um técnico de suporte da Microsoft determinar que uma actualização específica resolverá o problema. Os custos de normais do suporte serão aplicados a questões de suporte adicionais e problemas que não se enquadrem na atualização específica em questão.

Pré-requisitos

Tem de ter o Visual Studio 2008 Service Pack 1 instalado para aplicar esta correcção.

Requisito de reinício

Não é necessário reiniciar o computador depois de aplicar esta correcção.

Informações sobre substituição da correção

Esta correcção não substitui quaisquer outras correcções.

Informações de ficheiro

A versão inglesa desta correcção tem os atributos de ficheiro (ou atributos de ficheiro posteriores) listados na seguinte tabela. As datas e horas destes ficheiros são listadas na hora Universal Coordenada (UTC). Quando visualiza as informações do ficheiro, é convertido para a hora local. Para determinar a diferença entre a UTC e a hora local, utilize o separador Fuso horário no item data e hora no painel de controlo.

Nome do ficheiro

Versão do ficheiro

Tamanho do ficheiro

Data

Hora

Plataforma

C2.dll

15.0.30729. 4082

2,283,320

19-Mar-2009

05:13

x86

C2.dll

15.0.30729.4082

2,36 1,656

19-Mar-2009

05:13

x86

C2.dll

15.0.30729.4082

3,01 7,528

19-Mar-2009

05:13

x64

Link.exe

9.0.30729.4082

1,0 54,520

19-Mar-2009

05:13

x64

Link.exe

9.0.30729.4082

799, 032

19-Mar-2009

05:13

x86

Solução alternativa

Para contornar este problema, adicione um ou mais membros fictício "não assinado char" para expandir o tamanho da estrutura ou da classe para o múltiplo mais pequeno de 8 bytes. Por exemplo, expandir bytes 14 a 16 bytes.

Estado

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

Mais informações

Para mais informações sobre a terminologia de atualização de software, clique no seguinte número de artigo para visualizar o artigo na Base de Dados de Conhecimento Microsoft:

824684 descrição da terminologia padrão utilizada para descrever actualizações de software da Microsoft

Passos para reproduzir o problema

  1. Crie uma aplicação que chama Test.cpp utilizando o seguinte código no Visual Studio 2008 SP1:

    typedef struct DskDecimal{      unsigned char                       precision;              unsigned char                       scaleFactor;            unsigned short                      value[ 5];      unsigned char                       maxPrecision;      unsigned char                       maxScaleFactor;   } DskDecimal;int main(){      DskDecimal decimal;      decimal.maxScaleFactor = 4;      DskDecimal self = decimal;      return self.maxScaleFactor;}
  2. Compile a aplicação utilizando o seguinte comando:

    Cl test.cpp /O2 /MD

O resultado esperado é 4. No entanto, os resultados reais são 0.

Precisa de mais ajuda?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.

As comunidades ajudam-no a colocar e a responder perguntas, a dar feedback e a ouvir especialistas com conhecimentos abrangentes.