Процессоры работают эффективнее, когда имеют дело с правильно выровненными данными. А некоторые процессоры вообще не умеют работать с не выровненными данными.
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarovaБольшое количество ошибок при миграции на 64-битные системы связано с изменением соотношения между размером указателя и размером обычных целых. В среде с моделью данных ILP32 обычные целые и указатели имеют одинаковый размер. К сожалению, 32-битный код повсеместно опирается на это предположение. Указатели часто приводятся к int, unsigned, long, DWORD и другим неподходящим типам.
Урок 11. Паттерн 3. Операции сдвигаTatyanazaxarovaЛегко сделать ошибку в коде, работающем с отдельными битами. Рассматриваемый паттерн 64-битных ошибок связан с операциями сдвига.
Урок 23. Паттерн 15. Рост размеров структурTatyanazaxarovaСам по себе рост размера структур не является ошибкой, но может приводить к потреблению необоснованного количества памяти и в результате к замедлению скорости работы программы. Будем рассматривать данный паттерн не как ошибку, но как причину неэффективности 64-битного кода.
Как стандарт C++0x поможет в борьбе с 64-битными ошибкамиTatyanazaxarovaПрограммисты видят в стандарте C++0x возможность использовать лямбда-функции и прочие мало понятные для меня сущности :). Я увидел в нем удобные средства, позволяющие исключить многие 64-битные ошибки.
Урок 9. Паттерн 1. Магические числаTatyanazaxarovaВ некачественном коде часто встречаются магические числовые константы, наличие которых опасно само по себе. При миграции кода на 64-битную платформу эти константы могут сделать код неработоспособным, если участвуют в операциях вычисления адреса, размера объектов или в битовых операциях.
Урок 24. Фантомные ошибкиTatyanazaxarovaМы закончили рассмотрение паттернов 64-битных ошибок. Последнее на чем мы остановимся в связи с этими ошибками, является то, как они могут проявляться в программах.
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarovaМы специально выбрали номер "тринадцать" для этого урока, поскольку ошибки, связанные с адресной арифметикой в 64-битных системах, являются наиболее коварными. Надеемся, число 13 заставит вас быть внимательнее.
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Platonov SergeyСмешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического использования.
Оптимизация в мире 64-битных ошибокTatyanazaxarovaВ предыдущей записи блога я обещал рассказать, почему сложно демонстрировать 64-битные ошибки на простых примерах. Разговор касался operator[] и я говорил, что в простых случая может работать даже явно некорректный код.
Статический анализ и регулярные выраженияTatyanazaxarovaЯ занимаюсь разработкой статического анализатор кода PVS-Studio для анализа программ на языке Си/Си++. После появления в PVS-Studio 4.00 анализа общего назначения мы получили множество откликов, как положительных, так и отрицательных. Кстати, предлагаю скачать новую версию PVS-Studio, в которой благодаря откликам людей было поправлено большое количество ошибок и недочетов.
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarovaОсобенностью объединения (union) является то, что для всех элементов (членов) объединения выделяется одна и та же область памяти, то есть они перекрываются. Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат был осмысленным.
Статический анализ исходного кода на примере WinMergeTatyanazaxarovaСегодня я хочу посвятить пост тематике, почему инструменты анализа исходного кода полезны вне зависимости от уровня знаний и опыта программиста. А польза такого анализа будет продемонстрирована на примере инструмента, который известен всем программистам - WinMerge.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarovaИнструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarovaСтатья представляет собой наиболее полную коллекцию примеров 64-битных ошибок на языках Си и Си++. Статья ориентирована на разработчиков Windows-приложений, использующих Visual C++, но будет полезна и более широкой аудитории.
Что такое size_t и ptrdiff_tTatyanazaxarovaСтатья поможет читателю разобраться, что представляют собой типы size_t и ptrdiff_t, для чего они нужны и когда целесообразно их использование. Статья будет интересна разработчикам, начинающим создание 64-битных приложений, где использование типов size_t и ptrdiff_t обеспечивает быстродействие, возможность работы с большими объемами данных и переносимость между разными платформами.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...YandexФлеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#Andrey KarpovВыполняет анализ кода на языках: C, C++, C++/CLI, C++/CX, C#. Plugin для Visual Studio 2010-2015. Интеграция с SonarQube, QtCreator, CLion, Eclipse CDT, Anjuta DevStudio и т.д. Быстрый старт (мониторинг компиляции). Прямая интеграция анализатора в системы автоматизации сборки и утилита BlameNotifier (рассылка писем). Режим автоматического анализа изменённых файлов. Почему нужны анализаторы кода?
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.TatyanazaxarovaЯ добрался до кода широко известного клиента мгновенных сообщений Miranda IM. Вместе с различными плагинами это достаточно большой проект, размер которого составляет около 950 тысяч строк кода на C и C++. И, как в любом солидном проекте с историей развития, в нем имеется немалое количество ошибок и опечаток.
PVS-Studio, решение для разработки современных ресурсоемких приложенийOOO "Program Verification Systems"PVS-Studio - статический анализатор кода, который предназначен для разработчиков современных ресурсоемких приложений.
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarovaУ компилятора и сторонних инструментов статического анализа кода есть общая задача - выявление опасных фрагментов кода. Однако существует существенная разница в том, анализ какого типа они осуществляют. Я попробую на примере компилятора Intel C++ и анализатора PVS-Studio продемонстрировать различия подходов, и пояснить, чем они вызваны.
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarovaВ статье производится сравнение специализированного статического анализатора Viva64 со статическими анализаторами общего назначения Parasoft C++test и Gimpel Software PC-Lint. Сравнение производится в рамках задачи переноса 32-битного Си/Си++ кода на 64-битные системы или разработки нового кода с учетом особенностей 64-битной архитектуры.
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarovaМы специально выбрали номер "тринадцать" для этого урока, поскольку ошибки, связанные с адресной арифметикой в 64-битных системах, являются наиболее коварными. Надеемся, число 13 заставит вас быть внимательнее.
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Platonov SergeyСмешивание управляемого и неуправляемого C++ кода в Microsoft Visual Studio, примеры практического использования.
Оптимизация в мире 64-битных ошибокTatyanazaxarovaВ предыдущей записи блога я обещал рассказать, почему сложно демонстрировать 64-битные ошибки на простых примерах. Разговор касался operator[] и я говорил, что в простых случая может работать даже явно некорректный код.
Статический анализ и регулярные выраженияTatyanazaxarovaЯ занимаюсь разработкой статического анализатор кода PVS-Studio для анализа программ на языке Си/Си++. После появления в PVS-Studio 4.00 анализа общего назначения мы получили множество откликов, как положительных, так и отрицательных. Кстати, предлагаю скачать новую версию PVS-Studio, в которой благодаря откликам людей было поправлено большое количество ошибок и недочетов.
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarovaОсобенностью объединения (union) является то, что для всех элементов (членов) объединения выделяется одна и та же область памяти, то есть они перекрываются. Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат был осмысленным.
Статический анализ исходного кода на примере WinMergeTatyanazaxarovaСегодня я хочу посвятить пост тематике, почему инструменты анализа исходного кода полезны вне зависимости от уровня знаний и опыта программиста. А польза такого анализа будет продемонстрирована на примере инструмента, который известен всем программистам - WinMerge.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarovaИнструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarovaСтатья представляет собой наиболее полную коллекцию примеров 64-битных ошибок на языках Си и Си++. Статья ориентирована на разработчиков Windows-приложений, использующих Visual C++, но будет полезна и более широкой аудитории.
Что такое size_t и ptrdiff_tTatyanazaxarovaСтатья поможет читателю разобраться, что представляют собой типы size_t и ptrdiff_t, для чего они нужны и когда целесообразно их использование. Статья будет интересна разработчикам, начинающим создание 64-битных приложений, где использование типов size_t и ptrdiff_t обеспечивает быстродействие, возможность работы с большими объемами данных и переносимость между разными платформами.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...YandexФлеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#Andrey KarpovВыполняет анализ кода на языках: C, C++, C++/CLI, C++/CX, C#. Plugin для Visual Studio 2010-2015. Интеграция с SonarQube, QtCreator, CLion, Eclipse CDT, Anjuta DevStudio и т.д. Быстрый старт (мониторинг компиляции). Прямая интеграция анализатора в системы автоматизации сборки и утилита BlameNotifier (рассылка писем). Режим автоматического анализа изменённых файлов. Почему нужны анализаторы кода?
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.TatyanazaxarovaЯ добрался до кода широко известного клиента мгновенных сообщений Miranda IM. Вместе с различными плагинами это достаточно большой проект, размер которого составляет около 950 тысяч строк кода на C и C++. И, как в любом солидном проекте с историей развития, в нем имеется немалое количество ошибок и опечаток.
PVS-Studio, решение для разработки современных ресурсоемких приложенийOOO "Program Verification Systems"PVS-Studio - статический анализатор кода, который предназначен для разработчиков современных ресурсоемких приложений.
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarovaУ компилятора и сторонних инструментов статического анализа кода есть общая задача - выявление опасных фрагментов кода. Однако существует существенная разница в том, анализ какого типа они осуществляют. Я попробую на примере компилятора Intel C++ и анализатора PVS-Studio продемонстрировать различия подходов, и пояснить, чем они вызваны.
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarovaВ статье производится сравнение специализированного статического анализатора Viva64 со статическими анализаторами общего назначения Parasoft C++test и Gimpel Software PC-Lint. Сравнение производится в рамках задачи переноса 32-битного Си/Си++ кода на 64-битные системы или разработки нового кода с учетом особенностей 64-битной архитектуры.
Пояснения к статье про Copy-PasteTatyanazaxarovaМногим читателя понравилась моя статья "Последствия использования технологии Copy-Paste при программировании на Си++ и как с этим быть" [1]. Обратил на неё внимание и Scott Meyers [2] и задал вопрос о том, как же собственно статический анализ помог выявить описанные в статье ошибки.
Статический анализ кода: Что? Как? Зачем?Andrey KarpovМетодология статического анализа год за годом зарекомендовывает себя в поисках дефектов в исходном коде программ.
Максим расскажет про:
- методологию статического анализа и какие плюсы и минусы у нее есть;
- технологии этой методологии, которые позволяют выявлять разнообразнейшие дефекты в коде;
- интересные примеры ошибок в реальных проектах, которые были найдены при помощи статического анализа;
- интеграцию инструментов статического анализа в проекты любой сложности, и почему так важно регулярное использование подобных инструментов.
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarovaКлассическими примерами, приводимыми во многих статьях по проблемам переноса программ на 64-битные системы, является некорректное использование функций printf, scanf и их разновидностей.
Статический анализ Си++ кодаTatyanazaxarovaМы все допускаем ошибки при программировании и тратим массу времени на их устранение.
Один из методов который позволяет быстро диагностировать дефекты – статический анализ исходного кода.
ADD 2011: Статический анализ Си++ кодаAndrey KarpovЯзыки C, C++ и C++0x как набор ножей по дереву. С их помощью создаются великолепные изделия, но немного неаккуратности и можно глубоко порезаться. Одной из самых ранних методик обнаружения ошибок в коде программ является статический анализ кода. Запуская анализ сразу после написания нового кода или во время ночных сборок, можно выявить множество ошибок еще до этапа тестирования. Это сокращает стоимость и время их исправления. Также могут быть обнаружены дефекты, редко проявляющие себя, которые могут являться головной болью на протяжении многих месяцев сопровождения программы.
В докладе будет продемонстрировано множество примеров ошибок в известных open source программах и библиотеках, которые можно обнаружить с помощью статических анализаторов.
Цена ошибкиPlatonov SergeyМногие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Цена ошибкиAndrey KarpovЧасто программисты даже не догадываются, как дорого обходится ошибка. Очень важно, чтобы ошибки обнаруживались на самых ранних этапах.
PVS-Studio vs ChromiumTatyanazaxarovaВ этот раз победу одержало добро. А вернее, исходные коды проекта Chromium. Chromium - один из лучших проектов, который мы проверяли с помощью PVS-Studio.
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarovaЭто моя очередная заметка о том, как PVS-Studio делает программы более надёжными. То есть где, и какие ошибки он обнаруживает. На этот раз под молоток попали примеры, демонстрирующие работу с библиотекой IPP 7.0 (Intel Performance Primitives Library).
Безопасность 64-битного кодаTatyanazaxarovaВ статье рассматриваются вопросы обеспечения безопасности программного кода при его адаптации для 64-битных систем.
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarovaПри разработке 64-битной версии приложения дополнительное внимание стоит уделить и вопросу дистрибуции программы. Ведь при установке на 64-битной операционной системе есть несколько нюансов, забыв о которых можно получить неработающий инсталляционный пакет.
Урок 26. Оптимизация 64-битных программTatyanazaxarovaПосле компиляции программы в 64-битном режиме она начинает потреблять большее количество памяти, чем ее 32-битный вариант. Часто это увеличение почти незаметно, но иногда потребление памяти может возрастать в 2 раза.
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarovaДанная статья содержит различные примеры 64-битных ошибок, собранные в демонстрационном примере PortSample. Однако, начиная с версии PVS-Studio 3.63, вместо PortSample в дистрибутив PVS-Studio включается более новая версия примеров, которая называется OmniSample. Поэтому некоторые скриншоты в статье не соответствуют актуальному состоянию дел.
Урок 20. Паттерн 12. ИсключенияTatyanazaxarovaГенерирование и обработка исключений с участием целочисленных типов не является хорошей практикой программирования на языке Си++. Для этих целей следует использовать более информативные типы, например классы, производные от класса std::exception.
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarovaВажным элементом переноса программного решения на новую платформу является преемственность к существующим протоколам обмена данными. Необходимо обеспечить чтение существующих форматов проектов, осуществлять обмен данными между 32-битными и 64-битными процессами и так далее.
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarovaНадеемся, вы уже успели отдохнуть от 13 урока и теперь сможете рассмотреть еще один важный паттерн ошибок, связанный с арифметическими выражениями, в которых участвуют типы различной размерности.
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarovaСтатический анализ кода - методология выявления ошибок в программном коде, основанная на просмотре программистом участков кода, помеченных статическим анализатором. Помеченные участки кода с большой вероятностью содержат ошибки определенного типа.
Урок 7. Проблемы выявления 64-битных ошибокTatyanazaxarovaСуществуют различные подходы к выявлению ошибок в программном коде. Рассмотрим основные методологии и их эффективность в выявлении 64-битных ошибок.
Урок 6. Ошибки в 64-битном кодеTatyanazaxarovaИсправление всех ошибок компиляции и предупреждений не будет означать работоспособность 64-битного приложения. И именно описанию и диагностике 64-битных ошибок будет посвящена основная часть уроков. Также не надейтесь на помощь ключа /Wp64, который многими часто без оснований преподносится при обсуждениях в форумах как чудесное средство поиска 64-битных ошибок.
Урок 5. Сборка 64-битного приложенияTatyanazaxarovaХочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс.
Урок 4. Создание 64-битной конфигурацииTatyanazaxarovaВначале следует убедиться, что используемая вами редакция Visual Studio позволяет собирать 64-битный код. Если вы планируете разрабатывать 64-битные приложения с использованием последней версии (на момент написания курса) Visual Studio 2008, то следующая таблица поможет определить, какая из редакций Visual Studio вам необходима.
PVS-Studio TatyanazaxarovaPVS-Studio - статический анализатор, выявляющий ошибки в исходном коде приложений на языке C/C++/C++0x. Можно выделить 3 набора правил, включенных в состав PVS-Studio:
1. Диагностика 64-битных ошибок (Viva64)
2. Диагностика параллельных ошибок (VivaMP)
3. Диагностика общего назначения
PVS-Studio научился следить за тем, как вы программируетеTatyanazaxarovaВ PVS-Studio появился режим работы, который поможет максимально рано выявлять ошибки и опечатки. Анализатор запускается сразу после компиляции файлов и если что-то не так, покраснеет от стыда за ваш код. Фича доступна на данный момент только для пользователей Visual Studio 2010.
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...TatyanazaxarovaОдним из нововведений в последних версиях MSBuild/Visual Studio для компиляторов Visual C++ стала новая система минимальной сборки (также известная как инкрементная сборка), основанная на отслеживании зависимостей между входными и выходными данными при работе компилятора и позволяющая осуществлять пересборку только для файлов, затронутых модификацией исходного кода или не имеющих связанных с ними выходных объектных файлов. В отличие от старой методики минимальной пересборки, завязанной на генерируемые компилятором cl.exe файлы состояний (idb-файлы, Minimal Rebuild Dependancy Database, ключ /Gm) и обладавшей рядом недостатков (как например затруднённость распараллеливания сборки из-за конфликтов доступа и отсутствие прямого отслеживания выходных объектный файлов), новая система не зависит от типа используемых сборочных инструментов (может использоваться как для компиляции, так и для линковки) и имеет открытый API. Данная новинка позволила интегрировать проверку кода анализатором PVS-Studio в процесс разработки на C/C++ с использованием инкрементных пересборок для последней версии Visual Studio 2010. Эта возможность появилась в версии PVS-Studio 4.30.
Статический анализ и ROITatyanazaxarovaЯ регулярно общаюсь с потенциальными пользователями, озабоченными ошибками в программах на языке Си++. Их озабоченность выражается в том, что они пробуют инструмент PVS-Studio и начинают писать о том, что при испытаниях что-то подозрительно мало ошибок было найдено. И хотя, вроде чувствуется, что инструмент им интересен, их реакция полна скептицизма.
Вечный вопрос измерения времениTatyanazaxarovaКазалось, закончились долгие обсуждения в форумах, как измерить время работы алгоритма, какие функции использовать, какую точность ожидать. Жаль, но опять придется вернуться к этому вопросу. На повестке дня вопрос – как лучше измерить скорость работы параллельного алгоритма.
По колено в Си++ г... кодеTatyanazaxarovaНаверное, многие знают сайт govnokod.ru. Если нет - рекомендую заглянуть тем, кто считает себя программистом. Хорошее настроение будет обеспечено.
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...TatyanazaxarovaПредлагаем вниманию программистов новый инструмент для поиска ошибок в исходном коде приложений на языке Си/Си++. В рамках анализатора PVS-Studio реализован новый набор правил общего назначения. Эта функциональность на данный момент является бесплатной.
Трепещи, мир! Мы выпустили PVS-Studio 4.00 с бесплатным анализатором общего н...Tatyanazaxarova
Урок 21. Паттерн 13. Выравнивание данных
1. Урок 21. Паттерн 13. Выравнивание
данных
Процессоры работают эффективнее, когда имеют дело с правильно выровненными данными. А
некоторые процессоры вообще не умеют работать с не выровненными данными. Попытка
работать с не выровненными данными на процессорах IA-64 (Itanium), как показано в следующем
примере, приведет к возникновению исключения:
#pragma pack (1) // Also set by key /Zp in MSVC
struct AlignSample {
unsigned size;
void *pointer;
} object;
void foo(void *p) {
object.pointer = p; // Alignment fault
}
Если вы вынуждены работать с не выровненными данными на Itanium, то следует явно указать это
компилятору. Например, воспользоваться специальным макросом UNALIGNED:
#pragma pack (1) // Also set by key /Zp in MSVC
struct AlignSample {
unsigned size;
void *pointer;
} object;
void foo(void *p) {
*(UNALIGNED void *)&object.pointer = p; //Very slow
}
В этом случае компилятор сгенерирует специальный код, который будет работать с не
выровненными данными. Такое решение неэффективно, так как доступ к данным будет
происходить в несколько раз медленнее. Если целью является уменьшение размера структуры, то
лучшего результата можно достичь, располагая данные в порядке уменьшения их размера.
Подробнее об этом будет рассказано в одном из следующих уроков.
На архитектуре x64 при обращении к не выровненным данным исключения не возникает, но их
также следует избегать. Во-первых, из-за существенного замедления скорости доступа к таким
данным, а во-вторых, из-за возможности переноса программы в будущем на платформу IA-64.
2. Рассмотрим еще один пример кода, не учитывающий выравнивание данных:
struct MyPointersArray {
DWORD m_n;
PVOID m_arr[1];
} object;
...
malloc( sizeof(DWORD) + 5 * sizeof(PVOID) );
...
Если мы хотим выделить объем памяти, необходимый для хранения объекта типа
MyPointersArray, содержащего 5 указателей, то мы должны учесть, что начало массива m_arr
будет выровнено по границе 8 байт. Расположение данных в памяти на разных системах
(Win32/Win64) показано на рисунке 1.
Рисунок 1- Выравнивание данных в памяти на системах Win32 и Win64
Корректный расчет размера должен выглядеть следующим образом:
struct MyPointersArray {
DWORD m_n;
PVOID m_arr[1];
} object;
...
3. malloc( FIELD_OFFSET(struct MyPointersArray, m_arr) +
5 * sizeof(PVOID) );
...
В приведенном коде мы узнаем смещение последнего члена структуры и суммируем это
смещение с его размером. Смещение члена структуры или класса можно узнать с использованием
макроса offsetof или FIELD_OFFSET.
Всегда используйте эти макросы для получения смещения в структуре, не опираясь на знание
размеров типов и выравнивания. Пример кода с правильным вычислением адреса члена
структуры:
struct TFoo {
DWORD_PTR whatever;
int value;
} object;
int *valuePtr =
(int *)((size_t)(&object) + offsetof(TFoo, value)); // OK
Разработчиков Linux-приложений может ждать еще одна неприятность, связанная с
выравниванием. О ней вы можете прочитать в нашем блоге в посте "Изменения выравнивания
типов и последствия".
Диагностика
Поскольку работа с не выровненными данными не приводит к ошибке на архитектуре x64, а
только к снижению производительности, инструмент PVS-Studio не предупреждает об
упакованных структурах. Но если для вас критична производительность приложения,
рекомендуем просмотреть все места в программе, где используется "#pragma pack". Для
архитектуры IA-64 данная проверка более актуальна, но анализатор PVS-Studio пока не
ориентирован на верификацию программ для IA-64. Если вы работаете с системами на базе
Itanium и планируете приобрести PVS-Studio, напишите нам, и мы обсудим вопросы адаптации
этого инструмента к особенностям IA-64.
Инструмент PVS-Studio позволяет обнаружить ошибки, связанные с вычислением размеров
объектов и смещений. Анализатор обнаруживает опасные арифметические выражения,
содержащие в себе несколько операторов sizeof(), что свидетельствует о возможной ошибке.
Диагностическое сообщение имеет номер V119.
Однако во многих случаях использование нескольких операторов sizeof() в рамках одного
выражения корректно и анализатор игнорирует подобные конструкции. Пример безопасных
выражений с несколькими операторами sizeof:
int MyArray[] = { 1, 2, 3 };
size_t MyArraySize =
4. sizeof(MyArray) / sizeof(MyArray[0]); //OK
assert(sizeof(unsigned) < sizeof(size_t)); //OK
size_t strLen = sizeof(String) - sizeof(TCHAR); //OK
Приложение
На рисунке 2 представлены размеры типов и их выравнивание. Для изучения размеров объектов и
их выравнивания на различных платформах вы также можете воспользоваться примером кода,
приведенным в записи блога "Изменения выравнивания типов и последствия".
Рисунок 2 - Размеры типов и их выравнивание.
5. Авторы курса: Андрей Карпов (karpov@viva64.com), Евгений Рыжков (evg@viva64.com).
Правообладателем курса "Уроки разработки 64-битных приложений на языке Си/Си++"
является ООО "Системы программной верификации". Компания занимается разработкой
программного обеспечения в области анализа исходного кода программ. Сайт компании:
http://www.viva64.com.
Контактная информация: e-mail: support@viva64.com, 300027, г. Тула, а/я 1800.