Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
Проблемы 64-битного кода в реальных про…

Проблемы 64-битного кода в реальных программах: изменение типа указателя

03 Дек 2009

Явные приведения типа часто маскируют ошибки, связанные с изменением типа указателя. Одной из таких ошибок является превращение указателя на 32-битные объекты в указатель на 64-битные объекты.

Рассмотрим пример, присланный пользователями нашего инструмента PVS-Studio (Viva64). Ошибка проявляет себя после переноса кода на 64-битную версию Windows:

void ProcessTime(long * pTime)
{
  time((time_t *)pTime);
}

В 32-битной программе использовался 32-битный вариант типа time_t. В 64-битной системе для использования доступен только 64-битный вариант типа time_t. Это явно указано в заголовочном файле crtdefs.h:

#ifdef  _USE_32BIT_TIME_T
#ifdef  _WIN64
#error You cannot use 32-bit time_t (_USE_32BIT_TIME_T) with _WIN64
#endif
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif

Продемонстрированное явное изменения типа указателя может привести к неопределенному поведению программы или ее аварийному завершению. Поиск подобных ошибок затруднен, поскольку конструкция явного приведения типа подавляет предупреждения компилятора (см. запись: "Поиск ошибок явного приведения типа в 64-битных программах").

Помочь обнаружить такие ошибки может диагностическое сообщение "V114. Dangerous explicit type pointer conversion", выдаваемое анализатором кода PVS-Studio (Viva64) при проверке 64-битных проектов. Помимо показанного примера, диагностическое сообщение V114 позволяет обнаружить родственную ошибку, связанную с изменением типа массива:

int array[4] = { 1, 2, 3, 4 };
size_t *sizetPtr = (size_t *)(array);
cout << sizetPtr[1] << endl;
Результат работы на 32-битной системе: 2
Результат работы на 64-битной системе: 17179869187
Популярные статьи по теме


Комментарии (0)

Следующие комментарии next comments
close comment form
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам