SlideShare uma empresa Scribd logo
1 de 4
Baixar para ler offline
Урок 5. Сборка 64-битного
приложения
Хочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-
битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации
настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны
только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать
процесс.


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

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


Ассемблер
Visual C++ не поддерживает 64-битный встроенный ассемблер. Вы должны использовать или
внешний 64-битный ассемблер (например, MASM), или иметь реализацию той же
функциональности на языке Си/Си++.


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

void foo(unsigned char) {}

void foo(unsigned int) {}

void a(const char *str)

{

    foo(strlen(str));

}

Данный код успешно компилируется в 32-битном режиме. А в 64-битном компилятор Visual C++
выдаст сообщение:

error C2668: 'foo' : ambiguous call to overloaded function
.xxxx.cpp(16): could be 'void foo(unsigned int)'

    .xxxx.cpp(15): or 'void foo(unsigned char)'

    while trying to match the argument list '(size_t)'

Функция strlen() возвращает тип size_t. На 32-битной системе тип size_t совпадает с типом unsigned
int и компилятор выбирает для вызова функцию void foo(unsigned int). В 64-битном режиме типы
size_t и unsigned int не совпадают. Тип size_t становится 64-битным, а тип unsigned int по-
прежнему остается 32-битным. В результате компилятор не знает, какой функции foo() отдать
предпочтение.

Теперь рассмотрим пример предупреждения, выдаваемого компилятором Visual C++ при сборке
кода в 64-битном режиме:

CArray<char, char> v;

int len = v.GetSize();

warning C4244: 'initializing' : conversion from 'INT_PTR' to 'int',

                      possible loss of data

Функция GetSize() возвращает тип INT_PTR, который совпадает с типом int в 32-битном коде. В 64-
битном коде тип INT_PTR имеет размер 64 бита, и происходит неявное приведение этого типа к
32-битному типу int. При этом теряются значения старших битов, о чем и предупреждает
компилятор. Неявное приведение типа может привести к ошибке, если количество элементов в
массиве превысит INT_MAX. Для устранения предупреждения и потенциальной ошибки следует
использовать для переменной "len" тип INT_PTR или ptrdiff_t.

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


Типы size_t и ptrdiff_t
Поскольку большинство ошибок и предупреждений на этапе компиляции будет связано с
несовместимостью типов данных, рассмотрим два типа size_t и ptrdiff_t представляющих для нас
наибольший интерес с точки зрения создания 64-битного кода. Если вы используете компилятор
Visual C++, то эти типы являются для него встроенными, и подключения библиотечных файлов не
требуется. Если вы используете GCC, то вам потребуется использовать заголовочный файл
stddef.h.

size_t - базовый беззнаковый целочисленный тип языка Си/Си++. Является типом результата,
возвращаемого оператором sizeof. Размер типа выбирается таким образом, чтобы в него можно
было записать максимальный размер теоретически возможного массива любого типа. Например,
на 32-битной системе size_t будет занимать 32 бита, на 64-битной - 64 бита. Другими словами в
переменную типа size_t может быть безопасно помещен указатель. Исключение составляют
указатели на функции классов, но это особый случай. Тип size_t обычно применяется для
счетчиков циклов, индексации массивов, хранения размеров, адресной арифметики. Аналогами
данному типу являются: SIZE_T, DWORD_PTR, WPARAM, ULONG_PTR. Хотя в size_t можно помещать
указатель, для этих целей лучше подходит другой беззнаковый целочисленный тип uintptr_t, само
название которого отражает эту возможность. Типы size_t и uintptr_t являются синонимами.

ptrdiff_t - базовый знаковый целочисленный тип языка Си/Си++. Размер типа выбирается таким
образом, чтобы в него можно было записать максимальный размер теоретически возможного
массива любого типа. На 32-битной системе ptrdiff_t будет занимать 32 бита, на 64-битной - 64
бита. Как и в size_t в переменную типа ptrdiff_t может быть безопасно помещен указатель, за
исключением указателя на функцию класса. Также ptrdiff_t является результатом выражения, где
один указатель вычитается из другого (ptr1-ptr2). Тип ptrdiff_t обычно применяется для счетчиков
циклов, индексации массивов, хранения размеров, адресной арифметики. Аналогами данному
типу являются: SSIZE_T, LPARAM, INT_PTR, LONG_PTR. У типа ptrdiff_t есть синоним intptr_t,
название которого лучше отражает, что тип может хранить в себе указатель.

Типы size_t и ptrdiff_t были созданы для того, чтобы осуществлять корректную адресную
арифметику. Долгое время было принято считать, что размер int совпадает с размером
машинного слова (разрядностью процессора), и его можно использовать в качестве индексов, для
хранения размеров объектов или указателей. Соответственно адресная арифметика также
строилась с использованием типов int и unsigned. Тип int используется в большинстве обучающих
материалов по программированию на Си и Си++ в телах циклов и в качестве индексов.
Практически каноническим является код:

for (int i = 0; i < n; i++)

  a[i] = 0;

С развитием процессоров и ростом их разрядности стало нерационально дальнейшее увеличение
размерностей типа int. Причин для этого много: экономия используемой памяти, максимальная
совместимость и так далее. В результате появилось несколько моделей данных, описывающих
соотношение размеров базовых типов языков Си и Си++. Соответственно, не так просто стало
выбрать тип переменной для хранения указателя или размера объекта. Чтобы наиболее красиво
решить эту проблему и появились типы size_t и ptrdiff_t. Они гарантированно могут
использоваться для адресной арифметики. Теперь каноническим должен стать следующий код:

for (ptrdiff_t i = 0; i < n; i++)

  a[i] = 0;

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

Описанные типы size_t и ptrdiff_t можно назвать memsize-типами. Термин "memsize" возник, как
попытка лаконично назвать все типы, которые способны хранить в себе размер указателей и
индексов самых больших массивов. Под memsize-типом следует понимать все простые типы
данных языка Си/Си++, которые на 32-битой архитектуре имеют размер 32-бита, а на 64-битной
архитектуре - 64-бита. Примеры memsize-типов: size_t, ptrdiff_t, указатели, SIZE_T, LPARAM.

Авторы курса: Андрей Карпов (karpov@viva64.com), Евгений Рыжков (evg@viva64.com).
Правообладателем курса "Уроки разработки 64-битных приложений на языке Си/Си++"
является ООО "Системы программной верификации". Компания занимается разработкой
программного обеспечения в области анализа исходного кода программ. Сайт компании:
http://www.viva64.com.

Контактная информация: e-mail: support@viva64.com, 300027, г. Тула, а/я 1800.

Mais conteúdo relacionado

Mais procurados

Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarova
 
Статический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0xСтатический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0xTatyanazaxarova
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаTatyanazaxarova
 
Правила статического анализа кода для диагностики потенциально опасных констр...
Правила статического анализа кода для диагностики потенциально опасных констр...Правила статического анализа кода для диагностики потенциально опасных констр...
Правила статического анализа кода для диагностики потенциально опасных констр...Sergey Vasilyev
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаTatyanazaxarova
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarova
 
Безопасность 64-битного кода
Безопасность 64-битного кодаБезопасность 64-битного кода
Безопасность 64-битного кодаTatyanazaxarova
 
Как стандарт C++0x поможет в борьбе с 64-битными ошибками
Как стандарт C++0x поможет в борьбе с 64-битными ошибкамиКак стандарт C++0x поможет в борьбе с 64-битными ошибками
Как стандарт C++0x поможет в борьбе с 64-битными ошибкамиTatyanazaxarova
 
64-битный конь, который умеет считать
64-битный конь, который умеет считать64-битный конь, который умеет считать
64-битный конь, который умеет считатьTatyanazaxarova
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
 

Mais procurados (10)

Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Статический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0xСтатический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0x
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвига
 
Правила статического анализа кода для диагностики потенциально опасных констр...
Правила статического анализа кода для диагностики потенциально опасных констр...Правила статического анализа кода для диагностики потенциально опасных констр...
Правила статического анализа кода для диагностики потенциально опасных констр...
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединениях
 
Безопасность 64-битного кода
Безопасность 64-битного кодаБезопасность 64-битного кода
Безопасность 64-битного кода
 
Как стандарт C++0x поможет в борьбе с 64-битными ошибками
Как стандарт C++0x поможет в борьбе с 64-битными ошибкамиКак стандарт C++0x поможет в борьбе с 64-битными ошибками
Как стандарт C++0x поможет в борьбе с 64-битными ошибками
 
64-битный конь, который умеет считать
64-битный конь, который умеет считать64-битный конь, который умеет считать
64-битный конь, который умеет считать
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программах
 

Destaque

00 Paesita 2008 Resultados Por Centro Y SeccióN Sonsonate
00  Paesita 2008   Resultados Por Centro Y SeccióN Sonsonate00  Paesita 2008   Resultados Por Centro Y SeccióN Sonsonate
00 Paesita 2008 Resultados Por Centro Y SeccióN SonsonateAdalberto
 
Thift Shop Insights
Thift Shop InsightsThift Shop Insights
Thift Shop InsightsScott Pierce
 
Presentation VoiceInstant
Presentation VoiceInstantPresentation VoiceInstant
Presentation VoiceInstantQuobis
 
Presentación trabajo fina
Presentación trabajo finaPresentación trabajo fina
Presentación trabajo finajhonf214
 
Mongo DB Hackday Apr 28 2012
Mongo DB Hackday Apr 28 2012Mongo DB Hackday Apr 28 2012
Mongo DB Hackday Apr 28 2012Arun Nagarajan
 
E business e-market actualizado
E business e-market actualizadoE business e-market actualizado
E business e-market actualizado13dakota
 
Aprendizaje Cooperativo 22453 27667
Aprendizaje Cooperativo 22453 27667Aprendizaje Cooperativo 22453 27667
Aprendizaje Cooperativo 22453 27667Juan Cherre
 
ESA - Qué es? Objetivos
ESA - Qué es? ObjetivosESA - Qué es? Objetivos
ESA - Qué es? Objetivoseixcinc
 
Agenda de Comercio Exterior: Informe 2010-Perspectivas 2011.
Agenda de Comercio Exterior: Informe 2010-Perspectivas 2011.Agenda de Comercio Exterior: Informe 2010-Perspectivas 2011.
Agenda de Comercio Exterior: Informe 2010-Perspectivas 2011.COMEXpresentacion
 
Presentación del contador Envir durante la Feria Genera en Madrid
Presentación del contador Envir durante la Feria Genera en MadridPresentación del contador Envir durante la Feria Genera en Madrid
Presentación del contador Envir durante la Feria Genera en MadridAlbasolar
 
Vale Security Conference - 2011 - 13 - Nelson Brito
Vale Security Conference - 2011 - 13 - Nelson BritoVale Security Conference - 2011 - 13 - Nelson Brito
Vale Security Conference - 2011 - 13 - Nelson BritoVale Security Conference
 
Akademy es2010 ideal_library_rafael_fernandez
Akademy es2010 ideal_library_rafael_fernandezAkademy es2010 ideal_library_rafael_fernandez
Akademy es2010 ideal_library_rafael_fernandezAkademyEs2010
 
S&A Compañia
S&A CompañiaS&A Compañia
S&A CompañiaAHSalazar
 

Destaque (20)

Roma
RomaRoma
Roma
 
00 Paesita 2008 Resultados Por Centro Y SeccióN Sonsonate
00  Paesita 2008   Resultados Por Centro Y SeccióN Sonsonate00  Paesita 2008   Resultados Por Centro Y SeccióN Sonsonate
00 Paesita 2008 Resultados Por Centro Y SeccióN Sonsonate
 
Thift Shop Insights
Thift Shop InsightsThift Shop Insights
Thift Shop Insights
 
Y Prime - CTMS
Y Prime - CTMSY Prime - CTMS
Y Prime - CTMS
 
Presentation VoiceInstant
Presentation VoiceInstantPresentation VoiceInstant
Presentation VoiceInstant
 
Presentación1
Presentación1Presentación1
Presentación1
 
Francisco chiluisa
Francisco chiluisaFrancisco chiluisa
Francisco chiluisa
 
Presentación trabajo fina
Presentación trabajo finaPresentación trabajo fina
Presentación trabajo fina
 
Realtor 360
Realtor 360Realtor 360
Realtor 360
 
Mongo DB Hackday Apr 28 2012
Mongo DB Hackday Apr 28 2012Mongo DB Hackday Apr 28 2012
Mongo DB Hackday Apr 28 2012
 
E business e-market actualizado
E business e-market actualizadoE business e-market actualizado
E business e-market actualizado
 
Aprendizaje Cooperativo 22453 27667
Aprendizaje Cooperativo 22453 27667Aprendizaje Cooperativo 22453 27667
Aprendizaje Cooperativo 22453 27667
 
ESA - Qué es? Objetivos
ESA - Qué es? ObjetivosESA - Qué es? Objetivos
ESA - Qué es? Objetivos
 
Agenda de Comercio Exterior: Informe 2010-Perspectivas 2011.
Agenda de Comercio Exterior: Informe 2010-Perspectivas 2011.Agenda de Comercio Exterior: Informe 2010-Perspectivas 2011.
Agenda de Comercio Exterior: Informe 2010-Perspectivas 2011.
 
Presentación del contador Envir durante la Feria Genera en Madrid
Presentación del contador Envir durante la Feria Genera en MadridPresentación del contador Envir durante la Feria Genera en Madrid
Presentación del contador Envir durante la Feria Genera en Madrid
 
Above theclouds
Above thecloudsAbove theclouds
Above theclouds
 
Aduanas
AduanasAduanas
Aduanas
 
Vale Security Conference - 2011 - 13 - Nelson Brito
Vale Security Conference - 2011 - 13 - Nelson BritoVale Security Conference - 2011 - 13 - Nelson Brito
Vale Security Conference - 2011 - 13 - Nelson Brito
 
Akademy es2010 ideal_library_rafael_fernandez
Akademy es2010 ideal_library_rafael_fernandezAkademy es2010 ideal_library_rafael_fernandez
Akademy es2010 ideal_library_rafael_fernandez
 
S&A Compañia
S&A CompañiaS&A Compañia
S&A Compañia
 

Semelhante a Урок 5. Сборка 64-битного приложения

Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеTatyanazaxarova
 
Забытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программЗабытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программTatyanazaxarova
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
 
Красивая 64-битная ошибка на языке Си
Красивая  64-битная ошибка на языке СиКрасивая  64-битная ошибка на языке Си
Красивая 64-битная ошибка на языке СиTatyanazaxarova
 
Оптимизация 64-битных программ
Оптимизация 64-битных программОптимизация 64-битных программ
Оптимизация 64-битных программTatyanazaxarova
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурTatyanazaxarova
 
Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебеTatyanazaxarova
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
7 шагов по переносу программы на 64-битную систему
7 шагов по переносу программы на 64-битную систему7 шагов по переносу программы на 64-битную систему
7 шагов по переносу программы на 64-битную системуTatyanazaxarova
 
64 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva6464 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva64Tatyanazaxarova
 
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vba
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vbaChislovye tipy dannykh_i_ikh_ispolzovanie_v_vba
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vbagreg1496
 
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryИнтервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryTatyanazaxarova
 
Паттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играхПаттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играхAndrey Karpov
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
Сущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCoreСущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCoreTatyanazaxarova
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIAlexey Paznikov
 

Semelhante a Урок 5. Сборка 64-битного приложения (20)

Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложений
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном коде
 
Забытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программЗабытые проблемы разработки 64-битных программ
Забытые проблемы разработки 64-битных программ
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Красивая 64-битная ошибка на языке Си
Красивая  64-битная ошибка на языке СиКрасивая  64-битная ошибка на языке Си
Красивая 64-битная ошибка на языке Си
 
Оптимизация 64-битных программ
Оптимизация 64-битных программОптимизация 64-битных программ
Оптимизация 64-битных программ
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структур
 
Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебе
 
Step cpp0201
Step cpp0201Step cpp0201
Step cpp0201
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
7 шагов по переносу программы на 64-битную систему
7 шагов по переносу программы на 64-битную систему7 шагов по переносу программы на 64-битную систему
7 шагов по переносу программы на 64-битную систему
 
64 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva6464 бита для Си++ программистов: от /Wp64 к Viva64
64 бита для Си++ программистов: от /Wp64 к Viva64
 
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vba
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vbaChislovye tipy dannykh_i_ikh_ispolzovanie_v_vba
Chislovye tipy dannykh_i_ikh_ispolzovanie_v_vba
 
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryИнтервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
 
Паттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играхПаттерны 64-битных ошибок в играх
Паттерны 64-битных ошибок в играх
 
паскаль 10кл 14
паскаль 10кл 14паскаль 10кл 14
паскаль 10кл 14
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
Сущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCoreСущность библиотеки анализа кода VivaCore
Сущность библиотеки анализа кода VivaCore
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPI
 

Mais de Tatyanazaxarova

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхTatyanazaxarova
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияTatyanazaxarova
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокTatyanazaxarova
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииTatyanazaxarova
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кодаTatyanazaxarova
 
PVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируетеPVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируетеTatyanazaxarova
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteTatyanazaxarova
 
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...Tatyanazaxarova
 
Статический анализ и ROI
Статический анализ и ROIСтатический анализ и ROI
Статический анализ и ROITatyanazaxarova
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времениTatyanazaxarova
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... кодеTatyanazaxarova
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выраженияTatyanazaxarova
 
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Tatyanazaxarova
 

Mais de Tatyanazaxarova (19)

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурации
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 
PVS-Studio
PVS-Studio PVS-Studio
PVS-Studio
 
PVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируетеPVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируете
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-Paste
 
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...
 
Статический анализ и ROI
Статический анализ и ROIСтатический анализ и ROI
Статический анализ и ROI
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... коде
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...
 

Урок 5. Сборка 64-битного приложения

  • 1. Урок 5. Сборка 64-битного приложения Хочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64- битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс. Библиотеки Прежде чем попытаться собрать ваше 64-битное приложение, проверьте, что установлены все необходимые версии 64-битных библиотек и к ним корректно прописаны пути. Например, 32- битные и 64-битные библиотечные lib файлы отличаются и, как правило, находятся в различных каталогах. Исправьте найденные недочеты. Примечание. Если библиотеки представлены в исходных кодах, то должна присутствовать 64- битная конфигурация проекта. Учтите, что самостоятельно занимаясь модернизацией библиотеки для сборки ее 64-битной версии, вы можете нарушить лицензионные соглашения. Ассемблер Visual C++ не поддерживает 64-битный встроенный ассемблер. Вы должны использовать или внешний 64-битный ассемблер (например, MASM), или иметь реализацию той же функциональности на языке Си/Си++. Примеры ошибок и предупреждений при компиляции Начав сборку проекта, вы обнаружите большое количество ошибок компиляции и предупреждений, связанных с явным и неявным приведением типов. Продемонстрируем пример возникновения одной из ошибок. Пусть мы имеем код: void foo(unsigned char) {} void foo(unsigned int) {} void a(const char *str) { foo(strlen(str)); } Данный код успешно компилируется в 32-битном режиме. А в 64-битном компилятор Visual C++ выдаст сообщение: error C2668: 'foo' : ambiguous call to overloaded function
  • 2. .xxxx.cpp(16): could be 'void foo(unsigned int)' .xxxx.cpp(15): or 'void foo(unsigned char)' while trying to match the argument list '(size_t)' Функция strlen() возвращает тип size_t. На 32-битной системе тип size_t совпадает с типом unsigned int и компилятор выбирает для вызова функцию void foo(unsigned int). В 64-битном режиме типы size_t и unsigned int не совпадают. Тип size_t становится 64-битным, а тип unsigned int по- прежнему остается 32-битным. В результате компилятор не знает, какой функции foo() отдать предпочтение. Теперь рассмотрим пример предупреждения, выдаваемого компилятором Visual C++ при сборке кода в 64-битном режиме: CArray<char, char> v; int len = v.GetSize(); warning C4244: 'initializing' : conversion from 'INT_PTR' to 'int', possible loss of data Функция GetSize() возвращает тип INT_PTR, который совпадает с типом int в 32-битном коде. В 64- битном коде тип INT_PTR имеет размер 64 бита, и происходит неявное приведение этого типа к 32-битному типу int. При этом теряются значения старших битов, о чем и предупреждает компилятор. Неявное приведение типа может привести к ошибке, если количество элементов в массиве превысит INT_MAX. Для устранения предупреждения и потенциальной ошибки следует использовать для переменной "len" тип INT_PTR или ptrdiff_t. Не торопитесь исправлять предупреждения до того, как познакомитесь с паттернами 64-битных ошибок. Вы можете случайно, не исправив ошибку, замаскировать ее и тем самым сделать ее обнаружение в дальнейшем более сложной задачей. О паттернах 64-битных ошибок, методах их обнаружения и исправления вы сможете познакомиться в последующих уроках. Также вы можете обратиться к следующим статьям: "20 ловушек переноса Си++ - кода на 64-битную платформу", "64-битный конь, который умеет считать". Типы size_t и ptrdiff_t Поскольку большинство ошибок и предупреждений на этапе компиляции будет связано с несовместимостью типов данных, рассмотрим два типа size_t и ptrdiff_t представляющих для нас наибольший интерес с точки зрения создания 64-битного кода. Если вы используете компилятор Visual C++, то эти типы являются для него встроенными, и подключения библиотечных файлов не требуется. Если вы используете GCC, то вам потребуется использовать заголовочный файл stddef.h. size_t - базовый беззнаковый целочисленный тип языка Си/Си++. Является типом результата, возвращаемого оператором sizeof. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива любого типа. Например, на 32-битной системе size_t будет занимать 32 бита, на 64-битной - 64 бита. Другими словами в переменную типа size_t может быть безопасно помещен указатель. Исключение составляют
  • 3. указатели на функции классов, но это особый случай. Тип size_t обычно применяется для счетчиков циклов, индексации массивов, хранения размеров, адресной арифметики. Аналогами данному типу являются: SIZE_T, DWORD_PTR, WPARAM, ULONG_PTR. Хотя в size_t можно помещать указатель, для этих целей лучше подходит другой беззнаковый целочисленный тип uintptr_t, само название которого отражает эту возможность. Типы size_t и uintptr_t являются синонимами. ptrdiff_t - базовый знаковый целочисленный тип языка Си/Си++. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива любого типа. На 32-битной системе ptrdiff_t будет занимать 32 бита, на 64-битной - 64 бита. Как и в size_t в переменную типа ptrdiff_t может быть безопасно помещен указатель, за исключением указателя на функцию класса. Также ptrdiff_t является результатом выражения, где один указатель вычитается из другого (ptr1-ptr2). Тип ptrdiff_t обычно применяется для счетчиков циклов, индексации массивов, хранения размеров, адресной арифметики. Аналогами данному типу являются: SSIZE_T, LPARAM, INT_PTR, LONG_PTR. У типа ptrdiff_t есть синоним intptr_t, название которого лучше отражает, что тип может хранить в себе указатель. Типы size_t и ptrdiff_t были созданы для того, чтобы осуществлять корректную адресную арифметику. Долгое время было принято считать, что размер int совпадает с размером машинного слова (разрядностью процессора), и его можно использовать в качестве индексов, для хранения размеров объектов или указателей. Соответственно адресная арифметика также строилась с использованием типов int и unsigned. Тип int используется в большинстве обучающих материалов по программированию на Си и Си++ в телах циклов и в качестве индексов. Практически каноническим является код: for (int i = 0; i < n; i++) a[i] = 0; С развитием процессоров и ростом их разрядности стало нерационально дальнейшее увеличение размерностей типа int. Причин для этого много: экономия используемой памяти, максимальная совместимость и так далее. В результате появилось несколько моделей данных, описывающих соотношение размеров базовых типов языков Си и Си++. Соответственно, не так просто стало выбрать тип переменной для хранения указателя или размера объекта. Чтобы наиболее красиво решить эту проблему и появились типы size_t и ptrdiff_t. Они гарантированно могут использоваться для адресной арифметики. Теперь каноническим должен стать следующий код: for (ptrdiff_t i = 0; i < n; i++) a[i] = 0; Именно он может обеспечить надежность, переносимость, быстродействие. Почему - станет ясно из дальнейших уроков. Описанные типы size_t и ptrdiff_t можно назвать memsize-типами. Термин "memsize" возник, как попытка лаконично назвать все типы, которые способны хранить в себе размер указателей и индексов самых больших массивов. Под memsize-типом следует понимать все простые типы данных языка Си/Си++, которые на 32-битой архитектуре имеют размер 32-бита, а на 64-битной архитектуре - 64-бита. Примеры memsize-типов: size_t, ptrdiff_t, указатели, SIZE_T, LPARAM. Авторы курса: Андрей Карпов (karpov@viva64.com), Евгений Рыжков (evg@viva64.com).
  • 4. Правообладателем курса "Уроки разработки 64-битных приложений на языке Си/Си++" является ООО "Системы программной верификации". Компания занимается разработкой программного обеспечения в области анализа исходного кода программ. Сайт компании: http://www.viva64.com. Контактная информация: e-mail: support@viva64.com, 300027, г. Тула, а/я 1800.