Update: Der Zugriff auf eine Struktur oder Klasse generiert Offset ist falsch beim Kompilieren einer Anwendung mit der Option/Ox oder/O2 in Visual Studio 2008 SP1


Problembeschreibung


Das folgende Szenario.
  • Sie erstellen eine Anwendung, die einen Byte aus einer Struktur oder einer Klasse in Microsoft Visual Studio 2008 Service Pack 1 (SP1) lädt.
  • Sie aktivieren die Optimierungsoption/Ox oder Optimierungsoption/O2 .
  • Kompilieren Sie die Anwendung mit einer Release-Konfiguration für die X64 Plattform.
In diesem Szenario stimmt der Offset, der Zugriff auf Strukturmember oder der Klassenmember generiert wird.

Dieses Problem tritt nur bei Größe der Struktur und den Offset oder die Klassengröße und den Offset eines der folgenden Paare gleich:

  • (14,13)
  • (15,13)
  • (22,21)
  • (23,21)
  • (30,29)
  • (31,29)

Problemlösung


Hotfix-Informationen

Ein unterstützter Hotfix ist inzwischen von Microsoft erhältlich. Es soll jedoch nur das Problem beheben, das in diesem Artikel beschrieben wird. Wenden Sie es nur auf Systeme an, bei denen dieses spezielle Problem auftritt. Dieser Hotfix wird möglicherweise noch getestet. Wenn Ihr System durch dieses Problem nicht schwerwiegend beeinträchtigt ist, empfehlen wir, auf das nächste Servicepack für Visual Studio 2008 warten, das diesen Hotfix enthält.

Wenn dieses Problem sofort beheben möchten, wenden Sie sich an Microsoft Support Services, um den Hotfix zu erhalten. Eine vollständige Liste der Telefonnummern des Microsoft Product Support Services und Informationen zu den Supportkosten finden Sie auf der folgenden Microsoft-Website:Hinweis In bestimmten Fällen können Gebühren, die normalerweise für Support-Anrufe anfallen abgebrochen werden, wenn ein Microsoft-Supportmitarbeiter feststellt, dass ein bestimmtes Update Ihr Problem behebt. Die normalen Supportkosten gilt für zusätzliche Supportfragen und Probleme, die nicht für das betreffende Update qualifizieren.

Voraussetzungen

Sie müssen Visual Studio 2008 Service Pack 1 installiert, um diesen Hotfix anwenden.

Neustartanforderung

Sie müssen keinen Neustart des Computers nach der Installation dieses Hotfixes durchführen.

Informationen zu ersetzten Hotfixes

Dieser Hotfix ersetzt keine anderen Hotfixes.

Dateiinformationen

Die englische Version dieses Hotfixes weist Dateiattribute (oder spätere Attribute), die in der folgenden Tabelle aufgelistet sind. Die Datums- und Uhrzeitangaben für diese Dateien sind in Coordinated Universal Time (UTC) aufgelistet. Wenn Sie die Dateiinformationen anzeigen, werden sie in die lokale Zeit konvertiert. Um die Differenz zwischen UTC und der Ortszeit zu finden, verwenden Sie die Registerkarte Zeitzone unter Datum und Uhrzeit in der Systemsteuerung.
DateinameDateiversionDateigrößeDatumZeitPlattform
C2.dll15.0.30729. 40822,283,32019. März 200905:13x86
C2.dll15.0.30729.40822,36 1.65619. März 200905:13x86
C2.dll15.0.30729.40823,01 7,52819. März 200905:13x64
Link.exe9.0.30729.40821,0 54,52019. März 200905:13x64
Link.exe9.0.30729.4082799, 03219-Mar-200905:13x86

PROBLEMUMGEHUNG


Um dieses Problem zu umgehen, fügen Sie mindestens dummy "unsigned Char" Mitglieder erweitert die Größe der Struktur oder Klasse auf das kleinste Vielfache von acht Bytes hinzu. Erweitern Sie, z. B. 14 Byte auf 16 Bytes.

Status


Microsoft hat bestätigt, dass es sich um ein Problem bei den Microsoft-Produkten handelt, die im Abschnitt „Eigenschaften“ aufgeführt sind.

Weitere Informationen


Um weitere Informationen zur Terminologie für Softwareupdates zu erhalten, klicken Sie auf die folgende Artikelnummer, um den Artikel der Microsoft Knowledge Base anzuzeigen:
824684 Erläuterung von der standardmäßigen Standardbegriffen bei Microsoft Softwareupdates

Schritte zum Reproduzieren des Problems

  1. Erstellen einer Anwendung, die mithilfe des folgenden Codes in Visual Studio 2008 SP1 Test.cpp heißt:
    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. Kompilieren Sie die Anwendung mit dem folgenden Befehl:
    CL test.cpp/O2/MD
Das Ergebnis ist 4. Das tatsächliche Ergebnis ist jedoch 0.