Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #57


Клуб профессиональных программистов "Весельчак У"
Информационная рассылка сайта и форума.  Выпуск No57 (2008-10-12).

Здравствуйте, уважаемые читатели!


Сегодня в выпуске: статья "20 ловушек переноса Си++ - кода на 64-битную платформу". Традиционно здесь публикуем только фрагмент, а целиком статью можно прочесть на нашем сайте в разделе C/C++. Так как статья довольно объемная, то, по техническим причинам, она разделена на две примерно равные части: первая часть и вторая часть. Затрагиваемые там вопросы полезно знать многим. Ведь со временем вам может понадобиться адаптировать ваш давно написанны код к новым, 64-битным платформам.


Выражаем благодарность наиболее активным участникам форума - модераторам и простым участникам, которые помогают посетителям нашего форума и делают его содержание полезным и интересным: dimka, Ochkarik, Kivals, HandKot, Finch, Вад, npak, LogRus, Алексей1153++, Sla, Basurman и многие другие. Спасибо, что вы с нами!


У нашего портала теперь есть День рождения!

Проанализировав имеющуюся в сети информацию, архивы нашего старого форума и послушав мнения участников форума, админстрация назначила Днем рождения Клуба программистов "Весельчак У" вторую пятницу декабря. Первоначальная дата была - 12 декабря, но, по просьбе софорумцев, "округлена" до ближайшей пятницы, чтобы легче было собраться и вместе отметить наш маленький праздник. Это не принципиальный вопрос - ведь, на самом деле, возраст Шелека еще больше и определить точную дату его рождения возможности нет.


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

Если у вас есть свои заметки, которые вы хотели бы опубликовать, присылайте их нам, мы разместим их в Вики или на форуме, в разделе "Статьи".


Пожалуйста, обратите внимание на следующую информацию!

Нашу рассылку читают в разных почтовых программах и через веб-интерфейс в разных браузерах. Добиться одинакого вида (хотя бы приблизительно одинакового) во всех этих вариантах просмотра практически невозможно, но можно хотя бы попытаться сделать вид рассылки приличным. Мы работаем над этим, и нам очень нужна ваша помощь. Если вы считаете, что та или иная часть рассылки у вас отображается некорректно, и если вас не затруднит, сделайте скриншот и пришлите его нам на почтовый ящик club@shelek.ru с пометкой "проблема с просмотром рассылки". Обязательно укажите название и версию программы, через которую читаете нашу рассылку, и номер рассылки.


Содержание.


Аннотация.

Рассмотрены программные ошибки, проявляющие себя при переносе Си++ - кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.


Введение.

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

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

Любая новая технология (как в программировании, так и в других областях) несет в себе, помимо преимуществ, также и некоторые ограничения или даже проблемы использования этой технологии. Точно такая же ситуация сложилась и в области разработки 64-битного программного обеспечения. Мы все знаем о том, что 64-битное программное обеспечение - это следующий этап развития информационных технологий. Однако немногие программисты пока реально столкнулись с нюансами этой области, а именно разработкой 64-битных программ.

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

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

  • с типовыми ошибками программирования, проявляющими себя на 64-битных системах;
  • с причинами, по которым эти ошибки проявляют себя (с соответствующими примерами);
  • с методами устранения перечисленных ошибок;
  • с обзором методик и средств поиска ошибок в 64-битных программах.

Приведенная информация позволит вам:

  • узнать отличия 32-битных и 64-битных систем;
  • избежать ошибок при написании кода для 64-битных систем;
  • ускорить процесс миграции 32-битного приложения на 64-битную архитектуру за счет существенного сокращения времени отладки и тестирования;
  • более точно и обоснованно прогнозировать время переноса кода на 64-битную систему.

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

Для облегчения понимания дальнейшего текста вначале вспомним некоторые типы, с которыми мы можем столкнуться (см. таблица N1).


Название типа
Размер-ность типа в битах (32-битная система)
Размер-ность типа в битах (64-битная система)
Описание
ptrdiff_t
32
64
Знаковый целочисленный тип, образующийся при вычитании двух указателей. Используется для хранения размеров. Иногда используется в качестве результата функции, возвращающей размер или -1 при возникновении ошибки.
size_t
32
64
Беззнаковый целочисленный тип. Результат оператора sizeof(). Служит для хранения размера или количества объектов.
intptr_t, uintptr_t, SIZE_T, SSIZE_T, INT_PTR, DWORD_PTR, и так далее
32
64
Целочисленные типы, способные хранить в себе значение указателя.
time_t
32
64
Время в секундах.
Таблица N1. Описание некоторых целочисленных типов.

В тексте будет использоваться термин "memsize" тип. Под memsize-типом мы будем понимать любой простой целочисленный тип, способный хранить в себе указатель и меняющий свою размерность при изменении разрядности платформы с 32-бит на 64-бита. Примеры memsize-типов: size_t, ptrdiff_t, все указатели, intptr_t, INT_PTR, DWORD_PTR.

Несколько слов следует уделить моделям данных, определяющим соотношения размеров фундаментальных типов для различных систем. В таблице N2 приведены модели данных, которые могут быть нам интересны.


Тип ILP32 LP64 LLP64 ILP64
char 8 8 8 8
short 16 16 16 16
int 32 32 32 64
long 32 64 32 64
longlong 64 64 64 64
size_t 32 64 64 64
pointer 32 64 64 64
Таблица N2. Модели 32-разрядных и 64-разрядных данных.

По умолчанию в статье будет считаться, что перенос программ осуществляется с системы, имеющей модель данных ILP32, на системы с моделью данных LP64 или LLP64.

И последнее: 64-битная модель в Linux (LP64) и Windows (LLP64) имеет различие только в размерности типа long. Поскольку это их единственное отличие, то для обобщения изложения мы будем избегать использования типов long, unsigned long, и будем использовать типы ptrdiff_t, size_t.

Приступим к рассмотрению типовых ошибок, возникающих при переносе программ на 64-битную архитектуру.


1. Отключенные предупреждения.

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

При переносе приложения следует обязательно включить предупреждения для всего проекта, помогающие проверить код на совместимость и внимательно проанализировать их. Это может существенно сэкономить время при отладке проекта на новой архитектуре.

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


Далее читайте здесь.


А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное