Симптомы
Рассмотрим следующую ситуацию.
-
Создать приложение, которое загружает байт из структуры или класса в Visual Studio 2008 Пакет обновления 1 (SP1).
-
Включите параметр оптимизации/O2 или /Ox параметра оптимизации.
-
Компиляция приложения с помощью конфигурации выпуска для x64 платформы.
В этом случае Неверное смещение, созданный для доступа к члену класса или члена структуры.
Эта проблема возникает, только если размер структуры и смещение или размер класса и смещение равно одному из следующих пар:
-
(14,13)
-
(15,13)
-
(22,21)
-
(23,21)
-
(30,29)
-
(31,29)
Решение
Сведения об исправлении
Исправление от корпорации Майкрософт доступно. Тем не менее он предназначен только для устранения проблемы, описанной в этой статье. Предлагаемое исправление должно применяться исключительно в системах, в которых обнаружена эта специфическая неполадка. Это исправление может проходить дополнительное тестирование. Таким образом, если вы не подвержены серьезно этой проблеме, рекомендуется дождаться следующего пакета обновления для Visual Studio 2008, содержащего это исправление.
Для немедленного решения этой проблемы обратитесь в службу поддержки пользователей Майкрософт для получения исправления. Полный список телефонов службы поддержки клиентов корпорации Майкрософт и сведения о стоимости поддержки посетите следующий веб-сайт корпорации Майкрософт:
http://support.microsoft.com/contactus/?ws=supportПримечание. В особых случаях оплата, предусмотренная за обращение в службу поддержки может быть отменена, если специалист службы технической поддержки Майкрософт определит, что обновление будет решением проблемы. Затраты на обычные услуги службы поддержки будут применяться к дополнительным вопросам и проблемам, которые не охватываются конкретным обновлением.
Предварительные условия
Необходимо установить пакет обновления 1 для Visual Studio 2008 для установки этого исправления.
Необходимость перезагрузки
Не требуется перезагружать компьютер после установки данного исправления.
Сведения о замене исправлений
Это исправление не заменяет других исправлений.
Сведения о файлах
Английская версия данного исправления содержит атрибуты файла (или более поздние атрибуты файлов), приведенные в следующей таблице. Дата и время для этих файлов указаны в формате общего скоординированного времени (UTC). При просмотре сведений о файле, он преобразуется в локальное время. Чтобы узнать разницу между временем по Гринвичу и местным временем, откройте вкладку Часовой пояс элемента Дата и время в панели управления.
Имя файла |
Версия файла |
Размер файла |
Дата |
Время |
Платформа |
---|---|---|---|---|---|
C2.dll |
15.0.30729. 4082 |
2,283,320 |
19 марта 2009 г. |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
2,36 1,656 |
19 марта 2009 г. |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
3,01 7,528 |
19 марта 2009 г. |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
1,0 54,520 |
19 марта 2009 г. |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
799, 032 |
19-Mar-2009 |
05:13 |
x86 |
Временное решение
Чтобы обойти эту проблему, добавьте один или несколько членов фиктивное «unsigned char» Чтобы расширить размер структуры или класса наименьшее кратным 8 байт. Например расширение 14 байт на 16 байт.
Статус
Корпорация Майкрософт подтверждает, что это проблема продуктов Майкрософт, перечисленных в разделе "Относится к".
Дополнительные сведения
Для получения дополнительных сведений о терминологии обновлений программного обеспечения щелкните следующий номер статьи базы знаний Майкрософт:
Описание 824684 Стандартные термины, используемые при описании обновлений программных продуктов Майкрософт
Действия по воспроизведению проблемы
-
Создайте приложение, которое называется Test.cpp, используя следующий код в Visual Studio 2008 с пакетом обновления 1:
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;
} -
Компиляция приложения с помощью следующей команды:
CL test.cpp/MD/O2
Ожидаемый результат равен 4. Тем не менее фактический результат равен 0.