Для получения триального ключа
заполните форму ниже
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

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

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

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

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

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

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


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
C++Builder, сборка 64-битных приложений…

C++Builder, сборка 64-битных приложений и ренессанс Viva64

01 Фев 2013

После долгих ожиданий в C++Builder XE3 Update 1 появилась возможность сборки 64-битных приложений. Это значит, что использующим этот инструмент разработчикам предстоит скоро столкнуться с незнакомым для них миром 64-битных ошибок.

Поддержка C++ Builder была прекращена в PVS-Studio после версии 5.20. По всем возникшим вопросам вы можете обратиться в нашу поддержку.

Что такое 64-битная ошибки?

Это самая обыкновенная ошибка в программе. Но у неё есть особенность. Она проявляет себя только в 64-битных программах [1]. В тоже время, собрав 32-битную версию программы, вы не обнаружите эту ошибку. Продемонстрируем в начале самый простой пример:

float *buf = (float *)malloc(1000 * sizeof(float));
unsigned X = (unsigned)buf;
...
float *p = (float *)X;

Указатель какое-то время хранится в переменной типа unsigned. В 64-битной программе указатель станет 64-битным, а тип unsigned по-прежнему состоит из 32 бит. В результате будут потеряны старшие биты, и последствия работы программы станут непредсказуемы. Дополнительно такая ошибка коварна тем, что будет редко проявлять себя в 64-битной программе. Беда произойдет только тогда, когда память будет выделена за пределами первых 4 гигабайт адресного пространства.

Показанная выше 64-битная ошибка проста и не интересна. Любой компилятор предупредит о подобном опасном приведении типов. Рассмотрим более интересный случай.

float *Array = (float *)malloc(1000 * sizeof(float));
float *p = Array + 500;
unsigned A = 3;
int B = -5;
p[A + B] = 1.0f;

Код будет работать в 32-битной программе и приведёт к падению 64-битной программы. Дело в том, что выражение "A + B" имеет тип unsigned int. Оно будет равно 0xFFFFFFFEu. Это конечно некорректно в любом случае. Однако в 32-битной системе при сложении указателя и числа произойдет переполнение. В результате 32-битная программа будет работать, не смотря на ошибку.

Эту ошибку найти уже гораздо сложнее. С точки зрения большинства компиляторов в коде нет ничего подозрительного. Не заметят компиляторы ничего подозрительного и в следующем коде:

size_t Count = BigValue;
for (unsigned Index = 0; Index != Count; Index++)
{ ... }

Если в 64-битной программе значение переменной Count станет больше UINT_MAX, то возникнет вечный цикл.

Все это только вершина айсберга. Существуют 64-битные ошибки связанные с использованием в коде магических чисел (4, 32, 0xFFFFFFFF). Есть ошибки в объявлении виртуальных функций. И так далее. Подробнее с различными паттернами 64-битных ошибок можно познакомиться в статье "Коллекция примеров 64-битных ошибок".

Нюансы оптимизации 64-битного кода

Помимо ошибок неожиданную неприятность может доставить замедление скорости работы 64-битной версии программы по сравнению с 32-битной. Вообще, 64-битная программа должна работать быстрее [2]. Однако на практике это не всегда так.

Причины, по которым может произойти замедление:

  • Используются неподходящие типы в качестве индексов массивов. Это приводит к огромному количеству бессмысленных приведений типов.
  • Используются неподходящие типы для хранения данных. Из-за увеличения размера массивов объем потребляемой памяти может вырасти в 2 раза. Как результат станет больше промахов в кэше и возрастет время пересылки данных по шине.
  • Увеличение размеров структур за счёт изменения выравнивания. Это также влечёт увеличение количества используемой памяти.

Что же делать? Как же быть?

Теперь вы узнали, что подготовка 64-битной версии программы состоит не только из перекомпиляции кода. Вы можете столкнуться со странными ошибками и замедлением работы.

Описания методов, как избежать 64-битных ошибок выходят за рамки этой статьи. Дело в том, что нюансов слишком много. В одну статью их поместить нет никакой возможности. Поэтому придётся ограничиться ссылкой.

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

Руководство по разработке 64-битных приложений на языке Си/Си++

Многим разработчикам, использующим Visual C++, уже известны эти материалы. Думаю, теперь они станут полезны и для тех, кто использует компилятор C++Builder. Раздел содержит информацию общего плана и будет полезен вне зависимости от используемых инструментов.

Viva64

Приведённой в руководстве информации достаточно для написания корректных 64-битных программ. Но это мало поможет, если необходимо перенести на 64-битную систему большой программный проект. Перечитать весь код и выявить подозрительные места невозможно.

Для решения этой задачи в статическом анализаторе PVS-Studio существует набор диагностических правил под названием Viva64. Этот самый полный набор для выявления 64-битных ошибок среди существующих.

Теперь, когда анализатор PVS-Studio стал доступен в среде C++Builder, программисты смогут с меньшими потерями времени и сил произвести перенос кода. Да, просмотреть все диагностические сообщения тяжело. Но, во-первых, это все равно лучше, чем долгое время вылавливать непонятные и плохо воспроизводимые ошибки [3]. Во-вторых, анализатор PVS-Studio имеет развитую систему подавления ложных срабатываний и мы всегда готовы подсказать как её настроить.

Здесь вы можете скачать полнофункциональную демонстрационную версию PVS-Studio. На момент написания статьи анализатор умеет интегрироваться в Embarcadero RAD Studio XE2 и XE3 (включая Update 1). В дальнейшем, возможно, будут поддержаны и другие версии.

Подготовка к переносу кода

На самом деле, взять старый проект и попытаться собрать 64-битную версию дело неблагодарное. Поэтому многие разработчики, использующие C++Builder, захотят делать это постепенно. В начале, есть смысл подготовить код, а только потом приступить к попыткам его компиляции в 64-битном варианте. Анализатор PVS-Studio поможет заранее устранить большинство 64-битных ошибок. Он позволяет проверять не только 64-битные, но и 32-битные проекты.

На всякий случай следует уточнить, что полноценный анализ возможен только в случае 64-битного проекта. Есть множество моментов, которые затрудняют выявление 64-битных дефектов в 32-битных проектах. Самые наглядные пример это директивы препроцессора. Если какое-то участок кода не компилируется в 32-битной программе, то соответственно он не будет проверен и ошибки в нём найдены не будут.

Заключение

Помимо приведённых в статье ссылок хочу порекомендовать ещё некоторые разделы нашего сайта:

  • Обзоры различных статей по тематике разработки 64-битных программ.
  • База знаний (в основном связана с разработкой 64-битных приложений).
  • Twitter с новостями о языке Си++, разработке 64-битных программ и так далее.

Желаю вам безглючных 64-битных программ.

Дополнительные материалы

Популярные статьи по теме
Единороги компании PVS-Studio

Дата: 30 Авг 2022

Автор: Андрей Карпов

Скорее всего вы перешли на эту статью, заинтересовавшись одним из наших рисунков единорогов. Приятно видеть ваш интерес. Сейчас мы расскажем, почему рисуем этих единорогов, что они означают и чем воо…
Обрабатывать ли в PVS-Studio вывод других инструментов?

Дата: 26 Май 2022

Автор: Андрей Карпов

Анализатор PVS-Studio умеет "схлопывать" повторяющиеся предупреждения. Предоставляет возможность задать baseline, что позволяет легко внедрять статический анализ в legacy-проекты. Стоит ли предостави…
15000 ошибок в открытых проектах

Дата: 24 Май 2022

Автор: Андрей Карпов

Количество багов в нашей коллекции перевалило за отметку 15000. Именно такое количество ошибок обнаружила команда PVS-Studio в различных открытых проектах. Особенно интересно, что это всего лишь побо…
Комментарии в коде как вид искусства

Дата: 04 Май 2022

Автор: Сергей Хренов

Приветствую всех программистов, а также сочувствующих. Кто из нас хотя бы раз в жизни не оставлял комментарии в коде? Был ли это ваш код, а может, чужой? Что за комментарии вы написали: полезные или …
Visual Studio 2022 стильно и свежо. История о её поддержке в PVS-Studio

Дата: 15 Фев 2022

Автор: Николай Миронов

Кажется, анонс Visual Studio 2022 был только недавно, и вот она уже вышла. Это означало ровно одно – поддержать данную IDE нужно в ближайшем релизе PVS-Studio. О том, с какими сложностями пришлось ст…

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

Следующие комментарии
Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно. Хотите узнать подробнее?
Принять