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
-
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; } -
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.