CORRECÇÃO: O deslocamento que é gerado para aceder a um membro de estrutura ou um membro de classe está incorrecto quando compilar uma aplicação utilizando a opção de /Ox ou a opção /O2 no Visual Studio 2008 SP1

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?

Aumente os seus conhecimentos
Explore as formações
Seja o primeiro a obter novas funcionalidades
Aderir ao Microsoft insiders

As informações foram úteis?

Obrigado pelos seus comentários!

Obrigado pelo seu feedback! Parece que poderá ser benéfico reencaminhá-lo para um dos nossos agentes de suporte do Office.

×