Poprawka: Przesunięcie, która jest generowana dostępu do członka struktury lub członek klasy jest niepoprawna, podczas kompilowania aplikacji, za pomocą opcji/OX lub opcji/O2 w dodatku SP1 dla programu Visual Studio 2008


Objawy


Rozważmy następujący scenariusz.
  • Utwórz aplikację, która ładuje bajt z struktury lub klasy w Microsoft Visual Studio 2008 z dodatkiem Service Pack 1 (SP1).
  • Możesz włączyć opcję optymalizacji/OX lub opcję optymalizacji/O2 .
  • Kompilowanie aplikacji przy użyciu konfiguracji wydania dla x64 platformy.
W tym scenariuszu przesunięcie, która jest generowana dostęp do elementu członkowskiego struktury lub członek klasy jest niepoprawna.

Ten problem występuje, gdy rozmiar struktury i przesunięcie lub w klasie i przesunięcie równa tylko jedną z następujących par:

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

Rozwiązanie


Informacje o poprawce

Obsługiwana poprawka jest obecnie udostępniana przez firmę Microsoft. Jednak jest ona przeznaczona do usunięcia tylko problemu opisanego w tym artykule. Zastosuj ją tylko w systemach, w których występuje ten problem. Ta poprawka może być wciąż w fazie testowania. Jeśli dany system nie jest poważnie narażony na ten problem, firma Microsoft zaleca, aby poczekać na następny program Visual Studio 2008 z dodatkiem Service pack zawierający tę poprawkę.

Aby natychmiast rozwiązać ten problem, skontaktuj się z biurem obsługi klienta Microsoft w celu uzyskania poprawki. Aby uzyskać pełną listę numerów telefonów pomocy technicznej firmy Microsoft oraz informacje o pomocy technicznej odwiedź następującą witrynę firmy Microsoft w sieci Web:Uwaga W wyjątkowych przypadkach opłaty za połączenie z pomocą techniczną mogą zostać anulowane, jeśli specjalista firmy Microsoft zdecyduje że określona aktualizacja, może rozwiązać Twój problem. Koszty obsługi zwykłych zastosuje się do dodatkowych pytań i problemów, których nie można rozwiązać przy użyciu określonej aktualizacji.

Wymagania wstępne

Musi mieć Visual Studio 2008 z dodatkiem Service Pack 1 zainstalowany, aby można było zastosować tę poprawkę.

Wymagania dotyczące ponownego uruchomienia

Nie musisz ponownie uruchomiać komputera po zastosowaniu tej poprawki.

Informacje dotyczące zastępowania poprawek

Ta poprawka nie zastępuje żadnych innych poprawek.

Informacje o plikach

Wersja anglojęzyczna tej poprawki ma atrybuty plików (lub nowsze) wymienione w poniższej tabeli. Daty i godziny odpowiadające tym plikom zostały podane w formacie uniwersalnego czasu koordynowanego (UTC, Coordinated Universal Time). Po wyświetleniu informacji o pliku są konwertowane na czas lokalny. Aby zobaczyć różnicę między czasem UTC i czasem lokalnym, należy użyć z karty Strefa czasowa w aplecie Data i godzina w Panelu sterowania.
Nazwa plikuWersja plikuRozmiar plikuDataGodzinaPlatforma
C2.dll15.0.30729. 40822,283,32019-Mar-200905:13x86
C2.dll15.0.30729.40821 2,36 65619-Mar-200905:13x86
C2.dll15.0.30729.40823,01 7,52819-Mar-200905:13x64
Link.exe9.0.30729.40821,0 54,52019-Mar-200905:13x64
Link.exe9.0.30729.4082799, 03219-Mar-200905:13x86

Obejście problemu


Aby obejść ten problem, należy dodać jeden lub więcej członków fikcyjny "unsigned char" rozszerzyć rozmiar struktury lub klasy do najmniejszej wielokrotnością liczby 8 bajtów. Na przykład rozszerzenie bajtów 14 do 16 bajtów.

Stan


Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji „Dotyczy”.

Więcej informacji


Aby uzyskać więcej informacji dotyczących terminologii aktualizacji oprogramowania, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
824684 Opis standardowej terminologii używanej do opisywania aktualizacji oprogramowania firmy Microsoft

Kroki prowadzące do odtworzenia problemu

  1. Utwórz aplikację o nazwie Test.cpp za pomocą następującego kodu w programie Visual Studio 2008 z dodatkiem 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. Kompilowanie aplikacji za pomocą następującego polecenia:
    Cl test.cpp/O2/MD
Oczekiwany wynik to 4. Jednakże rzeczywisty wynik jest równy 0.