SlideShare a Scribd company logo
1 of 3
Download to read offline
Урок 16. Паттерн 8. Memsize-типы в
объединениях
Особенностью объединения (union) является то, что для всех элементов (членов) объединения
выделяется одна и та же область памяти, то есть они перекрываются. Хотя доступ к этой области
памяти возможен с использованием любого из элементов, элемент для этой цели должен
выбираться так, чтобы полученный результат был осмысленным.

Следует внимательно отнестись к объединениям, имеющим в своем составе указатели и другие
члены типа memsize.

Когда возникает необходимость работать с указателем как с целым числом, иногда удобно
воспользоваться объединением, как показано в примере, и работать с числовым представлением
типа без использования явных приведений:

union PtrNumUnion {

  char *m_p;

  unsigned m_n;

} u;

u.m_p = str;

u.m_n += delta;

Данный код корректен на 32-битных системах и некорректен на 64-битных. Изменяя член m_n на
64-битной системе, мы работаем только с частью указателя m_p (смотри рисунок 1).




             Рисунок 1 - Формат объединения на 32-битной и 64-битной системе

Следует использовать тип, который будет соответствовать размеру указателя:

union PtrNumUnion {
char *m_p;

  size_t m_n; //type fixed

} u;

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

union SizetToBytesUnion {

  size_t value;

  struct {

     unsigned char b0, b1, b2, b3;

  } bytes;

} u;



SizetToBytesUnion u;

u.value = value;

size_t zeroBitsN = TranslateTable[u.bytes.b0] +

                        TranslateTable[u.bytes.b1] +

                        TranslateTable[u.bytes.b2] +

                        TranslateTable[u.bytes.b3];

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

union SizetToBytesUnion {

  size_t value;

  unsigned char bytes[sizeof(value)];

} u;



SizetToBytesUnion u;

u.value = value;

size_t zeroBitsN = 0;
for (size_t i = 0; i != sizeof(bytes); ++i)

  zeroBitsN += TranslateTable[bytes[i]];


Диагностика
Инструмент PVS-Studio позволяет быстро найти и просмотреть в коде программы все
объединения, содержащие memsize типы. Анализатор выдает диагностическое сообщение V117
для структур, на которые следует обратить внимание программисту при переносе кода на 64-
битную систему.

Авторы курса: Андрей Карпов (karpov@viva64.com), Евгений Рыжков (evg@viva64.com).

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

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

More Related Content

Viewers also liked

PPACA Summary Of Benefits And Coverage Guidance
PPACA Summary Of Benefits And Coverage GuidancePPACA Summary Of Benefits And Coverage Guidance
PPACA Summary Of Benefits And Coverage GuidanceRon Bechtol
 
Mansa Systems App Development Customer Success
Mansa Systems  App Development Customer SuccessMansa Systems  App Development Customer Success
Mansa Systems App Development Customer SuccessMansa Systems
 
Tui itc presentación itc 2011
Tui itc presentación itc 2011Tui itc presentación itc 2011
Tui itc presentación itc 2011RED CIDE Cide
 
Power point of s ta r chart
Power point of s ta r chartPower point of s ta r chart
Power point of s ta r chartherringtonm
 
Sales kit aurum series=ru
Sales kit aurum series=ruSales kit aurum series=ru
Sales kit aurum series=ruRoman Velbovets
 
“ Una nueva forma de hacer negocio con libertad ”
“ Una nueva forma de hacer negocio con libertad ”“ Una nueva forma de hacer negocio con libertad ”
“ Una nueva forma de hacer negocio con libertad ”Alicia Vasquez
 
Nature Of Light 2 Review
Nature Of Light 2 ReviewNature Of Light 2 Review
Nature Of Light 2 Reviewekozoriz
 
Exploration network chapter10
Exploration network chapter10Exploration network chapter10
Exploration network chapter10victdiazm
 
Fidelity International, The Worlds Investment Specialist
Fidelity International, The Worlds Investment SpecialistFidelity International, The Worlds Investment Specialist
Fidelity International, The Worlds Investment Specialistrichardfeenstra
 
Presentacion Informatik 2009
Presentacion Informatik 2009Presentacion Informatik 2009
Presentacion Informatik 2009Juan Cherre
 
Kiezen In De Kibboets
Kiezen In De KibboetsKiezen In De Kibboets
Kiezen In De KibboetsKarelSmouter
 
Soluciones IT para Media
Soluciones IT para MediaSoluciones IT para Media
Soluciones IT para MediaDiego Dal Cero
 
Weather and temperature
Weather and temperatureWeather and temperature
Weather and temperatureGianna Di Dino
 

Viewers also liked (20)

Informe discpacidad oms
Informe discpacidad omsInforme discpacidad oms
Informe discpacidad oms
 
PPACA Summary Of Benefits And Coverage Guidance
PPACA Summary Of Benefits And Coverage GuidancePPACA Summary Of Benefits And Coverage Guidance
PPACA Summary Of Benefits And Coverage Guidance
 
Mansa Systems App Development Customer Success
Mansa Systems  App Development Customer SuccessMansa Systems  App Development Customer Success
Mansa Systems App Development Customer Success
 
Slides Upf2010 SesióN #8
Slides Upf2010 SesióN #8Slides Upf2010 SesióN #8
Slides Upf2010 SesióN #8
 
Ormaiztegiko argiteria katalogoa
Ormaiztegiko argiteria katalogoaOrmaiztegiko argiteria katalogoa
Ormaiztegiko argiteria katalogoa
 
Slides Upf2010 Sesión #5 Public
Slides Upf2010 Sesión #5 PublicSlides Upf2010 Sesión #5 Public
Slides Upf2010 Sesión #5 Public
 
Tui itc presentación itc 2011
Tui itc presentación itc 2011Tui itc presentación itc 2011
Tui itc presentación itc 2011
 
Power point of s ta r chart
Power point of s ta r chartPower point of s ta r chart
Power point of s ta r chart
 
Presentación Amauta
Presentación AmautaPresentación Amauta
Presentación Amauta
 
Sales kit aurum series=ru
Sales kit aurum series=ruSales kit aurum series=ru
Sales kit aurum series=ru
 
“ Una nueva forma de hacer negocio con libertad ”
“ Una nueva forma de hacer negocio con libertad ”“ Una nueva forma de hacer negocio con libertad ”
“ Una nueva forma de hacer negocio con libertad ”
 
Daiana Espinola
Daiana EspinolaDaiana Espinola
Daiana Espinola
 
Nature Of Light 2 Review
Nature Of Light 2 ReviewNature Of Light 2 Review
Nature Of Light 2 Review
 
Exploration network chapter10
Exploration network chapter10Exploration network chapter10
Exploration network chapter10
 
Clasificación Liga de Petanca 2012
Clasificación Liga de Petanca 2012Clasificación Liga de Petanca 2012
Clasificación Liga de Petanca 2012
 
Fidelity International, The Worlds Investment Specialist
Fidelity International, The Worlds Investment SpecialistFidelity International, The Worlds Investment Specialist
Fidelity International, The Worlds Investment Specialist
 
Presentacion Informatik 2009
Presentacion Informatik 2009Presentacion Informatik 2009
Presentacion Informatik 2009
 
Kiezen In De Kibboets
Kiezen In De KibboetsKiezen In De Kibboets
Kiezen In De Kibboets
 
Soluciones IT para Media
Soluciones IT para MediaSoluciones IT para Media
Soluciones IT para Media
 
Weather and temperature
Weather and temperatureWeather and temperature
Weather and temperature
 

Similar to Урок 16. Паттерн 8. Memsize-типы в объединениях

Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаСравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarova
 
Разработка статического анализатора кода для обнаружения ошибок переноса прог...
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Разработка статического анализатора кода для обнаружения ошибок переноса прог...
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Tatyanazaxarova
 
20 ловушек переноса Си++ - кода на 64-битную платформу
20 ловушек переноса Си++ - кода на 64-битную платформу20 ловушек переноса Си++ - кода на 64-битную платформу
20 ловушек переноса Си++ - кода на 64-битную платформуTatyanazaxarova
 
Что такое size_t и ptrdiff_t
Что такое size_t и ptrdiff_tЧто такое size_t и ptrdiff_t
Что такое size_t и ptrdiff_tTatyanazaxarova
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программTatyanazaxarova
 
Как стандарт C++0x поможет в борьбе с 64-битными ошибками
Как стандарт C++0x поможет в борьбе с 64-битными ошибкамиКак стандарт C++0x поможет в борьбе с 64-битными ошибками
Как стандарт C++0x поможет в борьбе с 64-битными ошибкамиTatyanazaxarova
 
VAMR ACADEMY Второе занятие
VAMR ACADEMY Второе занятиеVAMR ACADEMY Второе занятие
VAMR ACADEMY Второе занятиеmixARConference
 
Статический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0xСтатический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0xTatyanazaxarova
 
Оптимизация в мире 64-битных ошибок
Оптимизация  в мире 64-битных ошибокОптимизация  в мире 64-битных ошибок
Оптимизация в мире 64-битных ошибокTatyanazaxarova
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаTatyanazaxarova
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Javametaform
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarova
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
 
массивы Php
массивы Phpмассивы Php
массивы PhpVasya Petrov
 
Правила статического анализа кода для диагностики потенциально опасных констр...
Правила статического анализа кода для диагностики потенциально опасных констр...Правила статического анализа кода для диагностики потенциально опасных констр...
Правила статического анализа кода для диагностики потенциально опасных констр...Sergey Vasilyev
 
презентация лекции №3
презентация лекции №3презентация лекции №3
презентация лекции №3student_kai
 

Similar to Урок 16. Паттерн 8. Memsize-типы в объединениях (20)

Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаСравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
 
Разработка статического анализатора кода для обнаружения ошибок переноса прог...
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Разработка статического анализатора кода для обнаружения ошибок переноса прог...
Разработка статического анализатора кода для обнаружения ошибок переноса прог...
 
20 ловушек переноса Си++ - кода на 64-битную платформу
20 ловушек переноса Си++ - кода на 64-битную платформу20 ловушек переноса Си++ - кода на 64-битную платформу
20 ловушек переноса Си++ - кода на 64-битную платформу
 
Что такое size_t и ptrdiff_t
Что такое size_t и ptrdiff_tЧто такое size_t и ptrdiff_t
Что такое size_t и ptrdiff_t
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программ
 
Как стандарт C++0x поможет в борьбе с 64-битными ошибками
Как стандарт C++0x поможет в борьбе с 64-битными ошибкамиКак стандарт C++0x поможет в борьбе с 64-битными ошибками
Как стандарт C++0x поможет в борьбе с 64-битными ошибками
 
VAMR ACADEMY Второе занятие
VAMR ACADEMY Второе занятиеVAMR ACADEMY Второе занятие
VAMR ACADEMY Второе занятие
 
Статический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0xСтатический анализ Си++ кода и новый стандарт языка C++0x
Статический анализ Си++ кода и новый стандарт языка C++0x
 
Оптимизация в мире 64-битных ошибок
Оптимизация  в мире 64-битных ошибокОптимизация  в мире 64-битных ошибок
Оптимизация в мире 64-битных ошибок
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложений
 
массивы Php
массивы Phpмассивы Php
массивы Php
 
Правила статического анализа кода для диагностики потенциально опасных констр...
Правила статического анализа кода для диагностики потенциально опасных констр...Правила статического анализа кода для диагностики потенциально опасных констр...
Правила статического анализа кода для диагностики потенциально опасных констр...
 
презентация лекции №3
презентация лекции №3презентация лекции №3
презентация лекции №3
 
лек11 5
лек11 5лек11 5
лек11 5
 
лек11 5
лек11 5лек11 5
лек11 5
 
паскаль 10кл 14
паскаль 10кл 14паскаль 10кл 14
паскаль 10кл 14
 

More from Tatyanazaxarova

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияTatyanazaxarova
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными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
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеTatyanazaxarova
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииTatyanazaxarova
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений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
 

More from Tatyanazaxarova (20)

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 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
 
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
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... коде
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 

Урок 16. Паттерн 8. Memsize-типы в объединениях

  • 1. Урок 16. Паттерн 8. Memsize-типы в объединениях Особенностью объединения (union) является то, что для всех элементов (членов) объединения выделяется одна и та же область памяти, то есть они перекрываются. Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат был осмысленным. Следует внимательно отнестись к объединениям, имеющим в своем составе указатели и другие члены типа memsize. Когда возникает необходимость работать с указателем как с целым числом, иногда удобно воспользоваться объединением, как показано в примере, и работать с числовым представлением типа без использования явных приведений: union PtrNumUnion { char *m_p; unsigned m_n; } u; u.m_p = str; u.m_n += delta; Данный код корректен на 32-битных системах и некорректен на 64-битных. Изменяя член m_n на 64-битной системе, мы работаем только с частью указателя m_p (смотри рисунок 1). Рисунок 1 - Формат объединения на 32-битной и 64-битной системе Следует использовать тип, который будет соответствовать размеру указателя: union PtrNumUnion {
  • 2. char *m_p; size_t m_n; //type fixed } u; Другое частое использование объединения - это представление одного члена, набором других более мелких. Например, нам может потребоваться разбить значение типа size_t на байты для реализации табличного алгоритма подсчета количества нулевых битов: union SizetToBytesUnion { size_t value; struct { unsigned char b0, b1, b2, b3; } bytes; } u; SizetToBytesUnion u; u.value = value; size_t zeroBitsN = TranslateTable[u.bytes.b0] + TranslateTable[u.bytes.b1] + TranslateTable[u.bytes.b2] + TranslateTable[u.bytes.b3]; Здесь допущена принципиальная алгоритмическая ошибка, заключающаяся в предположении, что тип size_t состоит из 4 байт. Возможность автоматического поиска алгоритмических ошибок пока вряд ли возможна, но мы можем осуществить поиск всех объединений и проверить наличие в них memsize-типов. Найдя такое объединение, мы можем обнаружить алгоритмическую ошибку и переписать код следующим образом. union SizetToBytesUnion { size_t value; unsigned char bytes[sizeof(value)]; } u; SizetToBytesUnion u; u.value = value; size_t zeroBitsN = 0;
  • 3. for (size_t i = 0; i != sizeof(bytes); ++i) zeroBitsN += TranslateTable[bytes[i]]; Диагностика Инструмент PVS-Studio позволяет быстро найти и просмотреть в коде программы все объединения, содержащие memsize типы. Анализатор выдает диагностическое сообщение V117 для структур, на которые следует обратить внимание программисту при переносе кода на 64- битную систему. Авторы курса: Андрей Карпов (karpov@viva64.com), Евгений Рыжков (evg@viva64.com). Правообладателем курса "Уроки разработки 64-битных приложений на языке Си/Си++" является ООО "Системы программной верификации". Компания занимается разработкой программного обеспечения в области анализа исходного кода программ. Сайт компании: http://www.viva64.com. Контактная информация: e-mail: support@viva64.com, 300027, г. Тула, а/я 1800.