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

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

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

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

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

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

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


Если вы так и не получили ответ, пожалуйста, проверьте папку
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-битных программ.

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

Популярные статьи по теме
C++ — язык 2022 года. Почему так, и что с другими языками?

Дата: 20 Янв 2023

Автор: Сергей Васильев

C++ становится языком 2022 года по версии TIOBE, обгоняя Python. Rust, C#, Go и прочие — далеко позади. Странно? Сейчас разберёмся.
PVS-Studio в 2022 году

Дата: 19 Янв 2023

Автор: Полина Алексеева

На дворе январь 2023, а значит, самое время подвести итоги уже прошлого 2022 года. Мы расскажем, чем занимались, и покажем, что нового появилось в анализаторе за это время. Давайте вместе взглянем на…
PVS-Studio: 2 фишки для быстрого старта

Дата: 08 Дек 2022

Автор: Сергей Васильев

В этой заметке расскажу, как легко начать использовать PVS-Studio. Рассмотрим два сценария: когда вы пробуете анализатор впервые и когда внедряете его в проект.
Почему ты делаешь за меня мою работу? Типы людей, которые не пишут в поддержку

Дата: 06 Дек 2022

Автор: Алёна Фоканова

Привлекательное название статьи должно раскрывать то, что будет в ней. Так вот, работа специалистом поддержки клиентов подразумевает появление вопросов к пользователю. Иногда возникает как раз такой:…
Как Apple и другие крупные компании настиг программный баг

Дата: 09 Ноя 2022

Автор: Ульяна Гришина

Сегодня мы отобрали свежие случаи программных ошибок, чтобы вы могли немного отвлечься и, возможно, узнать что-то новенькое. Если вам интересно узнать, как программисту удалось сломать Интернет по вс…

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

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