KORRIGERA: Förskjutningen som genereras för att komma åt medlem struktur eller en klassmedlem är felaktig när du kompilerar ett program med hjälp av alternativet /Ox eller i /O2 i Visual Studio 2008 SP1

Symptom

Föreställ dig följande.

  • Du skapar ett program som läser in en byte från en struktur eller en klass i Microsoft Visual Studio 2008 Service Pack 1 (SP1).

  • Du aktiverar alternativet /Ox optimering eller optimeringsalternativ /O2 .

  • Du kan kompilera programmet med hjälp av en viktig konfiguration för x64 plattform.

I det här scenariot är förskjutningen som genereras för att komma åt medlemmen struktur eller klassmedlem felaktig.

Det här problemet uppstår endast när strukturstorlek och förskjutningen eller klass storlek och förskjutningen är lika med något av följande par:

  • (14,13)

  • (15,13)

  • (22,21)

  • (23,21)

  • (30,29)

  • (31,29)

Lösning

Information om snabbkorrigeringen

En snabbkorrigering är nu tillgänglig från Microsoft. Den är emellertid avsedd att åtgärda det problem som beskrivs i denna artikel. Använd den bara på datorer där detta problem uppstår. Snabbkorrigeringen kan komma att testas igen. Om inte störs alltför mycket av detta problem rekommenderar vi att du väntar på Nästa service pack för Visual Studio 2008, som innehåller denna snabbkorrigering.

Om du vill lösa problemet omedelbart kontaktar du Microsoft support för att få snabbkorrigeringen. En fullständig lista över telefonnummer till Microsoft Customer Support Services och information om supportkostnader finns på följande Microsoft-webbplats:

http://support.microsoft.com/contactus/?ws=supportObs! I särskilda fall avbryts de avgifter som är normala för supportsamtal om en supporttekniker anser att en särskild uppdatering kan lösa ditt problem. De vanliga supportkostnaderna gäller för övriga supportfrågor och problem som inte berör den särskilda uppdateringen.

Förutsättningar

Du måste ha Visual Studio 2008 Service Pack 1 installerat för att kunna installera den här snabbkorrigeringen.

Krav på omstart

Du behöver inte starta om datorn när du har installerat den här snabbkorrigeringen.

Ersättningsinformation för Hotfix

Den här snabbkorrigeringen ersätter inte några andra snabbkorrigeringar.

Filinformation

Den engelska versionen av den här snabbkorrigeringen har de filattribut (eller senare filattribut) som visas i följande tabell. Datum och tider för dessa filer anges i UTC-tid (UTC). När du visar filinformationen konverteras den till lokal tid. Använd fliken tidszon i datum och tid på Kontrollpanelen om du vill se skillnaden mellan UTC-tid och lokal tid.

Filnamn

Filversion

Storlek

Datum

Tid

Plattform

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

Temporär lösning

Undvik det här problemet genom att lägga till en eller flera medlemmar av dummy "osignerade char" om du vill utöka storleken av strukturen eller klassen till minsta multipel av åtta byte. Till exempel utöka 14 byte till 16 byte.

Status

Microsoft har bekräftat att detta är ett problem i Microsoft-produkterna som nämns i avsnittet "Gäller".

Mer Information

För mer information om terminologin för programuppdateringar klickar du på följande artikelnummer och läser artikeln i Microsoft Knowledge Base:

824684 beskrivning av standardterminologin som används för att beskriva Microsoft-programuppdateringar

Åtgärder för att återskapa problemet

  1. Skapa ett program som heter Test.cpp med följande kod i 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. Kompilera programmet med hjälp av följande kommando:

    CL test.cpp /O2 /MD

Det förväntade resultatet är 4. Men är det faktiska resultatet 0.

Behöver du mer hjälp?

Utöka dina kunskaper
Utforska utbildning
Få nya funktioner först
Anslut till Microsoft Insiders

Hade du nytta av den här informationen?

Tack för din feedback!

×