Sintomas
Considere o seguinte cenário:
-
Criar um aplicativo que carrega um byte de uma estrutura de ou de uma classe no Microsoft Visual Studio 2008 Service Pack 1 (SP1).
-
Ative a opção de otimização /Ox ou /O2 otimização.
-
Compilar o aplicativo usando uma configuração de lançamento para o x64 plataforma.
Nesse cenário, o deslocamento é gerado para acessar o membro da classe ou o membro da estrutura está incorreto.
Esse problema ocorre somente quando o tamanho da estrutura e o deslocamento ou o tamanho da turma e o offset igual a um dos seguintes pares:
-
(14,13)
-
(15,13)
-
(22,21)
-
(23,21)
-
(30,29)
-
(31,29)
Resolução
Informações sobre o hotfix
Um hotfix suportado está disponível agora na Microsoft. No entanto, destina-se a corrigir somente o problema descrito neste artigo. Aplique-o somente aos sistemas que apresentarem esse problema específico. Esta correção poderá ser submetida a testes adicionais. Portanto, se esse problema não o prejudicar, recomendamos que você aguarde o próximo service pack do Visual Studio 2008 que contém esse hotfix.
Para resolver esse problema imediatamente, contate o Atendimento Microsoft para obter o hotfix. Para obter uma lista completa dos números de telefone do Serviço de Atendimento ao Cliente Microsoft e informações sobre custos de suporte, visite o seguinte site da Microsoft:
http://support.microsoft.com/contactus/?ws=supportObservação: em alguns casos, as taxas cobradas para chamadas de suporte podem ser canceladas caso um profissional de Suporte da Microsoft determine que uma atualização específica resolverá o problema. Os custos normais de suporte serão aplicados para questões de suporte adicionais e problemas que não se qualificam à atualização específica em questão.
Pré-requisitos:
Você deve ter o Visual Studio 2008 Service Pack 1 instalado para aplicar esse hotfix.
Requisitos de reinicialização:
Você não precisa reiniciar o computador após aplicar esse hotfix.
Informações de substituição do hotfix:
Esse hotfix não substitui outros hotfixes.
Informações sobre o arquivo:
A versão em inglês deste hotfix possui os atributos de arquivo (ou atributos de arquivo posteriores) listados na tabela a seguir. As datas e horas desses arquivos estão listadas na Hora Universal Coordenada (UTC). Quando você exibe as informações do arquivo, ele é convertido para a hora local. Para localizar a diferença entre o UTC e a hora local, use a guia Fuso Horário no item Data e Hora no Painel de Controle.
Nome do Arquivo |
Versão do arquivo |
Tamanho do arquivo |
Data |
Hora |
Plataforma |
---|---|---|---|---|---|
C2.dll |
15.0.30729. 4082 |
2,283,320 |
19 de março de 2009 |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
1,656 2,36 |
19 de março de 2009 |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
7,528 3,01 |
19 de março de 2009 |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
54,520 1,0 |
19 de março de 2009 |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
799, 032 |
19-Mar-2009 |
05:13 |
x86 |
Solução alternativa
Para contornar esse problema, adicione um ou mais membros fictício "unsigned char" para estender o tamanho da estrutura ou da classe para o menor múltiplo de oito bytes. Por exemplo, estenda 14 bytes de 16 bytes.
Status
A Microsoft confirma que este é um problema em seus produtos listados na seção "Aplica-se a".
Mais informações
Para obter mais informações sobre a terminologia de atualização de software, clique no número abaixo para ler o artigo na Base de Conhecimento da Microsoft:
824684 descrição da terminologia padrão usada para descrever as atualizações de software
Etapas para simular o problema
-
Crie um aplicativo chamado Test.cpp usando 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;
} -
Compile o aplicativo usando o seguinte comando:
test.cpp CL /MD /O2
O resultado esperado é 4. No entanto, o resultado real é 0.