КОРЕКЦИЯ: Изместване, която се получава достъп до член структура или клас е неправилен, когато компилирате приложение чрез /Ox /O2 опцията или в Visual Studio 2008 SP1


Симптоми


Да разгледаме следния сценарий.
  • Можете да създадете приложение, което зарежда байт структура или клас в Microsoft Visual Studio 2008 Service Pack 1 (SP1).
  • Включване на /Ox оптимизация /O2 оптимизация опцията или.
  • Съставяне приложението чрез изданието конфигурация за x64 платформа.
В този случай offset, която се получава достъп до структура на члена или на клас е неправилен.

Този проблем възниква само когато размера на структурата и изместване или размера на класа и изместване равно един от следните двойки:

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

Решение


Информация за актуалната корекция

Вече се предлага от Microsoft предоставя поддържана актуална корекция. Но тя е предназначена да коригира само проблема, описан в тази статия. Прилагайте корекцията само към системи, изпитващи този конкретен проблем. Възможно е провеждането на допълнителни тестове на тази актуална корекция. Следователно ако не сте силно засегнати от този проблем, препоръчваме да изчакате следващия сервизен пакет за Visual Studio 2008, който ще съдържа тази корекция.

За незабавно решаване на проблема, се обърнете към услугите за поддръжка на клиенти на Microsoft да получите актуалната корекция. За пълен списък на телефонните номера на отдела за поддръжка на Microsoft и информация за цените на поддръжката посетете следния уеб сайт на Microsoft:Забележка: При специални случаи таксите, които са за свързани с поддръжката обаждания могат да бъдат отменени, ако специалист по поддръжката на Microsoft прецени, че конкретна актуализация може да разреши проблема. Обичайните такси за поддръжката ще важат за допълнителни въпроси и проблеми, които не спадат към съответната актуализация.

Необходими условия:

Трябва да имате Visual Studio 2008 Service Pack 1, за да приложите тази актуална корекция.

Изискване за рестартиране

Не трябва да рестартирате компютъра, след като приложите тази актуална корекция.

Информация за заместване на актуалната корекция

Тази актуална корекция не замества други спешни корекции.

Файлова информация

Англоезичната версия на тази спешна корекция има файлови атрибути (или по-нови файлови атрибути), които са изброени в следващата таблица. Датите и часовете за тези файлове са изброени в координирано световно време (UTC). При преглед на информацията за файла, преобразувана в местно време. За да намерите разликата между UTC и местното време, използвайте раздела часова зона в елемента " Дата и час " в контролния панел.
Име на файлВерсия на файлаРазмер на файлаДатаВремеПлатформа
C2.dll15.0.30729. 40822,283,32019 март 200905:13x86
C2.dll15.0.30729.40822,36 1,65619 март 200905:13x86
C2.dll15.0.30729.40823,01 7,52819 март 200905:13x64
Link.exe9.0.30729.40821,0 54,52019 март 200905:13x64
Link.exe9.0.30729.4082799, 03219-Mar-200905:13x86

Заобикаляне на проблема


За да заобиколите този проблем, добавете един или повече членове на сляпо "неподписани знак" за разширяване на размера на структурата или клас най-малката кратно на осем байта. Например разшири 14 байта до 16 байта.

Статус


Microsoft потвърждава, че това е проблем в продуктите на Microsoft, изброени в раздела "Отнася се за".

Допълнителна информация


За повече информация относно терминологията за актуализация на софтуера щракнете върху следния номер на статия, за да я видите в базата данни на Microsoft:
824684 описание на стандартната терминология, използвана за описание на софтуерните актуализации на Microsoft

Стъпки за възпроизвеждане на проблема

  1. Създаване на приложение, което се нарича Test.cpp чрез следния код в 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. Съставяне на приложението с помощта на следната команда:
    CL test.cpp /O2 /MD
Очакван резултат е 4. Но действителния резултат е 0.