В статье сформулированы правила диагностики потенциально опасных синтаксических конструкций в исходном коде программ на языке Си++. Описаны принципы построения статического анализатора исходного кода, реализующего проверку указанных правил.
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarova
В статье производится сравнение специализированного статического анализатора Viva64 со статическими анализаторами общего назначения Parasoft C++test и Gimpel Software PC-Lint. Сравнение производится в рамках задачи переноса 32-битного Си/Си++ кода на 64-битные системы или разработки нового кода с учетом особенностей 64-битной архитектуры.
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров, перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После такого переноса кода приложение может вести себя некорректно. В статье рассматривается вопрос разработки и применения статического анализатора кода для проверки правильности таких приложений. Приводятся проблемы, возникающие в приложениях после перекомпиляции для 64-битных систем, а также правила, по которым выполняется проверка кода.
Статья поможет читателю разобраться, что представляют собой типы size_t и ptrdiff_t, для чего они нужны и когда целесообразно их использование. Статья будет интересна разработчикам, начинающим создание 64-битных приложений, где использование типов size_t и ptrdiff_t обеспечивает быстродействие, возможность работы с большими объемами данных и переносимость между разными платформами.
20 ловушек переноса Си++ - кода на 64-битную платформуTatyanazaxarova
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ - кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Ключевые слова, типы, переменные операторы, команды, массивы. По-сути, готовился материал для собеседования, и для закрепления результата была создана данная презентация. Имеется более развёрнутый документ.
Здоровая критика, дополнения и замечания приветствуются.
Мы специально выбрали номер "тринадцать" для этого урока, поскольку ошибки, связанные с адресной арифметикой в 64-битных системах, являются наиболее коварными. Надеемся, число 13 заставит вас быть внимательнее.
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarova
В статье производится сравнение специализированного статического анализатора Viva64 со статическими анализаторами общего назначения Parasoft C++test и Gimpel Software PC-Lint. Сравнение производится в рамках задачи переноса 32-битного Си/Си++ кода на 64-битные системы или разработки нового кода с учетом особенностей 64-битной архитектуры.
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров, перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После такого переноса кода приложение может вести себя некорректно. В статье рассматривается вопрос разработки и применения статического анализатора кода для проверки правильности таких приложений. Приводятся проблемы, возникающие в приложениях после перекомпиляции для 64-битных систем, а также правила, по которым выполняется проверка кода.
Статья поможет читателю разобраться, что представляют собой типы size_t и ptrdiff_t, для чего они нужны и когда целесообразно их использование. Статья будет интересна разработчикам, начинающим создание 64-битных приложений, где использование типов size_t и ptrdiff_t обеспечивает быстродействие, возможность работы с большими объемами данных и переносимость между разными платформами.
20 ловушек переноса Си++ - кода на 64-битную платформуTatyanazaxarova
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ - кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Ключевые слова, типы, переменные операторы, команды, массивы. По-сути, готовился материал для собеседования, и для закрепления результата была создана данная презентация. Имеется более развёрнутый документ.
Здоровая критика, дополнения и замечания приветствуются.
Мы специально выбрали номер "тринадцать" для этого урока, поскольку ошибки, связанные с адресной арифметикой в 64-битных системах, являются наиболее коварными. Надеемся, число 13 заставит вас быть внимательнее.
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Tatyanazaxarova
Интервью с Дмитрием Вьюковым - автором инструмента Relacy Race Detector (RRD) для верификации параллельных приложений. В статье вы узнаете об истории создания RRD, его основных возможностях, а также о некоторых других аналогичных инструментах и их отличии от RRD.
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Tatyanazaxarova
В статье рассмотрена задача разработки программного инструмента под названием статический анализатор. Разрабатываемый инструмент используется для диагностики потенциально опасных синтаксических конструкций языка Си++ с точки зрения переноса программного кода на 64-битные системы. Акцент сделан не на самих проблемах переноса, возникающих в программах, а на особенностях создания специализированного анализатора кода. Анализатор предназначен для работы с кодом программ на языках Си и Си++.
В очередной раз убедился, что программисты пишут программы совершенно безалаберно. И работают они не благодаря их заслугам, а благодаря удачному стечению обстоятельств и заботе разработчиков компиляторов в Microsoft или Intel. Да, да, именно они заботятся и в нужный момент подставляют костылики нашим кривобоким программкам.
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
Теория языков программирования (немного об интерпретаторах, триадах, оптимизации, парсерах и прочее)
Compilers construction some lectures of whole course, it covers some methods on interpreters, optimisations, antlr, dsl (introduction)
Хочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс.
Статический анализ Си++ кода и новый стандарт языка C++0xTatyanazaxarova
В статье рассмотрены новые возможности языка Си++, описанные в стандарте C++0x и поддержанные в Visual Studio 2010. На примере PVS-Studio рассмотрено, как изменения языка отразятся на инструментах статического анализа кода.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
Инструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
У компилятора и сторонних инструментов статического анализа кода есть общая задача - выявление опасных фрагментов кода. Однако существует существенная разница в том, анализ какого типа они осуществляют. Я попробую на примере компилятора Intel C++ и анализатора PVS-Studio продемонстрировать различия подходов, и пояснить, чем они вызваны.
64 бита для Си++ программистов: от /Wp64 к Viva64Tatyanazaxarova
Развитие рынка 64-битных решений поставило новые задачи в области их верификации и тестирования. В статье говорится об одном из таких инструментов - Viva64. Это lint-подобный статический анализатор Си/Си++ кода, предназначенный специально для выявления ошибок, связанных с особенностями 64-битных платформ. Освещены предпосылки для создания данного анализатора и отражена его связь с режимом "Detect 64-Bit Portability Issues" в Си++ компиляторе Visual Studio 2005.
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
Статья представляет собой наиболее полную коллекцию примеров 64-битных ошибок на языках Си и Си++. Статья ориентирована на разработчиков Windows-приложений, использующих Visual C++, но будет полезна и более широкой аудитории.
Применение статического анализа при разработке программTatyanazaxarova
Статический анализ - это способ проверки исходного кода программы на корректность. Процесс статического анализа состоит из трех этапов. Сначала анализируемый код разбивается на лексемы - константы, идентификаторы, и т. д. Эта операция выполняется лексером. Затем лексемы передаются синтаксическому анализатору, который выстраивает по этим лексемам дерево кода. Наконец, проводится статический анализ построенного дерева. В данной обзорной статье приведено описание трех методов статического анализа: анализ с обходом дерева кода, анализ потока данных и анализ потока данных с выбором путей.
Иван Кочуркин. Теория и практика парсинга формальных языковMskDotNet Community
В докладе рассказывается об инструментах и практиках парсинга формальных языков: как исходного кода, так и собственных предметно-ориентированных (DSL). О том, какие бывают парсеры и проблемы при их использовании. Доклад повествует как о базовых вещах: о токенах, деревьях разбора, абстрактных синтаксических деревьях (AST), так и о продвинутых: о методах обработки препроцессорных директив и восстановления от ошибок, о парсинге островных, нечувствительных к регистру языков и фрагментов кода. Помимо парсинга в докладе затрагивается тема обработки древовидных структур. Материал доклада основан на практических задачах и акцентирован на технологиях ANTLR и Roslyn.
Исправление всех ошибок компиляции и предупреждений не будет означать работоспособность 64-битного приложения. И именно описанию и диагностике 64-битных ошибок будет посвящена основная часть уроков. Также не надейтесь на помощь ключа /Wp64, который многими часто без оснований преподносится при обсуждениях в форумах как чудесное средство поиска 64-битных ошибок.
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Tatyanazaxarova
Интервью с Дмитрием Вьюковым - автором инструмента Relacy Race Detector (RRD) для верификации параллельных приложений. В статье вы узнаете об истории создания RRD, его основных возможностях, а также о некоторых других аналогичных инструментах и их отличии от RRD.
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Tatyanazaxarova
В статье рассмотрена задача разработки программного инструмента под названием статический анализатор. Разрабатываемый инструмент используется для диагностики потенциально опасных синтаксических конструкций языка Си++ с точки зрения переноса программного кода на 64-битные системы. Акцент сделан не на самих проблемах переноса, возникающих в программах, а на особенностях создания специализированного анализатора кода. Анализатор предназначен для работы с кодом программ на языках Си и Си++.
В очередной раз убедился, что программисты пишут программы совершенно безалаберно. И работают они не благодаря их заслугам, а благодаря удачному стечению обстоятельств и заботе разработчиков компиляторов в Microsoft или Intel. Да, да, именно они заботятся и в нужный момент подставляют костылики нашим кривобоким программкам.
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
Теория языков программирования (немного об интерпретаторах, триадах, оптимизации, парсерах и прочее)
Compilers construction some lectures of whole course, it covers some methods on interpreters, optimisations, antlr, dsl (introduction)
Хочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс.
Статический анализ Си++ кода и новый стандарт языка C++0xTatyanazaxarova
В статье рассмотрены новые возможности языка Си++, описанные в стандарте C++0x и поддержанные в Visual Studio 2010. На примере PVS-Studio рассмотрено, как изменения языка отразятся на инструментах статического анализа кода.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
Инструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
У компилятора и сторонних инструментов статического анализа кода есть общая задача - выявление опасных фрагментов кода. Однако существует существенная разница в том, анализ какого типа они осуществляют. Я попробую на примере компилятора Intel C++ и анализатора PVS-Studio продемонстрировать различия подходов, и пояснить, чем они вызваны.
64 бита для Си++ программистов: от /Wp64 к Viva64Tatyanazaxarova
Развитие рынка 64-битных решений поставило новые задачи в области их верификации и тестирования. В статье говорится об одном из таких инструментов - Viva64. Это lint-подобный статический анализатор Си/Си++ кода, предназначенный специально для выявления ошибок, связанных с особенностями 64-битных платформ. Освещены предпосылки для создания данного анализатора и отражена его связь с режимом "Detect 64-Bit Portability Issues" в Си++ компиляторе Visual Studio 2005.
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
Статья представляет собой наиболее полную коллекцию примеров 64-битных ошибок на языках Си и Си++. Статья ориентирована на разработчиков Windows-приложений, использующих Visual C++, но будет полезна и более широкой аудитории.
Применение статического анализа при разработке программTatyanazaxarova
Статический анализ - это способ проверки исходного кода программы на корректность. Процесс статического анализа состоит из трех этапов. Сначала анализируемый код разбивается на лексемы - константы, идентификаторы, и т. д. Эта операция выполняется лексером. Затем лексемы передаются синтаксическому анализатору, который выстраивает по этим лексемам дерево кода. Наконец, проводится статический анализ построенного дерева. В данной обзорной статье приведено описание трех методов статического анализа: анализ с обходом дерева кода, анализ потока данных и анализ потока данных с выбором путей.
Иван Кочуркин. Теория и практика парсинга формальных языковMskDotNet Community
В докладе рассказывается об инструментах и практиках парсинга формальных языков: как исходного кода, так и собственных предметно-ориентированных (DSL). О том, какие бывают парсеры и проблемы при их использовании. Доклад повествует как о базовых вещах: о токенах, деревьях разбора, абстрактных синтаксических деревьях (AST), так и о продвинутых: о методах обработки препроцессорных директив и восстановления от ошибок, о парсинге островных, нечувствительных к регистру языков и фрагментов кода. Помимо парсинга в докладе затрагивается тема обработки древовидных структур. Материал доклада основан на практических задачах и акцентирован на технологиях ANTLR и Roslyn.
Исправление всех ошибок компиляции и предупреждений не будет означать работоспособность 64-битного приложения. И именно описанию и диагностике 64-битных ошибок будет посвящена основная часть уроков. Также не надейтесь на помощь ключа /Wp64, который многими часто без оснований преподносится при обсуждениях в форумах как чудесное средство поиска 64-битных ошибок.
The static code analysis rules for diagnosing potentially unsafe construction...Sergey Vasilyev
The article formulates the rules of diagnosing potentially unsafe syntactic constructions in source code of C++ programs and describes the principles of building a static source code analyzer implementing support of the mentioned rules.
The resource finding system is mainly divided into two parts. First part is the facility for HR people to maintain the projects project timeline (i.e. HR’s can add/delete a project and mark a project completed/failed) which will help in the accuracy calculation of the employee’s. Second part of the project is the data mining part, the HR will enter the required skills for upcoming project then the system will use the employee’s skill sets and accuracy (based on previous projects) to apply apriori algorithm.
Расчет минимального времени выполнения задач при оптимальном распределении на...Sergey Vasilyev
В презентации кратко рассмотрены методы расчета минимального времени выполнения задач при оптимальном распределении нагрузки между процессорами. Приведенные методы могут применяться для однородных и неоднородных вычислительных систем.
Презентация посвящена вопросам использования параллельных алгоритмов для создания современных эффективных программных решений. Актуальность данной тематики обусловлена снижением темпов роста тактовой частоты микропроцессоров и возрастанием внимания к использованию всех возможностей многоядерных и многопроцессорных систем. В работе рассмотрен ряд базовых параллельных алгоритмов, таких как умножение матриц, параллельная сортировка Бэтчера, метод Гаусса решения систем линейных алгебраических уравнений и так далее. Приведена реализация этих алгоритмов c использованием языка программирования Си++.
В некачественном коде часто встречаются магические числовые константы, наличие которых опасно само по себе. При миграции кода на 64-битную платформу эти константы могут сделать код неработоспособным, если участвуют в операциях вычисления адреса, размера объектов или в битовых операциях.
Забытые проблемы разработки 64-битных программTatyanazaxarova
Хотя история развития 64-битных систем составляет более десятилетия, появление 64-битных версий операционной системы Windows поставило перед разработчиками новые задачи в области разработки и тестирования программных решений. В статье рассмотрены некоторые ошибки связанные с разработкой 64-битного Си/Си++ кода под операционную систему Windows. Объяснены причины, по которым данные ошибки не нашли отражения в статьях, посвященных задачам миграции и неудовлетворительно выявляются большинством статических анализаторов.
После компиляции программы в 64-битном режиме она начинает потреблять большее количество памяти, чем ее 32-битный вариант. Часто это увеличение почти незаметно, но иногда потребление памяти может возрастать в 2 раза.
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
Важным элементом переноса программного решения на новую платформу является преемственность к существующим протоколам обмена данными. Необходимо обеспечить чтение существующих форматов проектов, осуществлять обмен данными между 32-битными и 64-битными процессами и так далее.
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
Классическими примерами, приводимыми во многих статьях по проблемам переноса программ на 64-битные системы, является некорректное использование функций printf, scanf и их разновидностей.
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
Сегодня я хочу посвятить пост тематике, почему инструменты анализа исходного кода полезны вне зависимости от уровня знаний и опыта программиста. А польза такого анализа будет продемонстрирована на примере инструмента, который известен всем программистам - WinMerge.
Большое количество ошибок при миграции на 64-битные системы связано с изменением соотношения между размером указателя и размером обычных целых. В среде с моделью данных ILP32 обычные целые и указатели имеют одинаковый размер. К сожалению, 32-битный код повсеместно опирается на это предположение. Указатели часто приводятся к int, unsigned, long, DWORD и другим неподходящим типам.
Что же получили программисты с приходом 64-битных систем? Помимо многочисленных преимуществ, о которых написаны сотни и тысячи рекламных статей, программисты получили целый набор задачек, головоломок и даже ловушек, с которыми предстоит столкнуться всем, кто хочет получить реальные преимущества от переноса кода на 64-битные системы.
Правила статического анализа кода для диагностики потенциально опасных конструкций с точки зрения 64-битных программ
1. Правила статического анализа кода для
диагностики потенциально опасных конструкций с
точки зрения 64-битных программ
Евгений Рыжков, октябрь 2008
2. Аннотация
В статье сформулированы правила диагностики потенциально опасных синтаксических конструкций в
исходном коде программ на языке Си++. Описаны принципы построения статического анализатора исходного
кода, реализующего проверку указанных правил.
Введение
Задача статического анализа исходного кода известна давно [1] и существуют традиционные методы ее
решения как с теоретической так и с практической точек зрения.
Вместе с тем развитие индустрии промышленной разработки программного обеспечения ставит перед
разработчиками статических анализаторов кода новые задачи. Речь идет о переносе кода (портированиии,
миграции) приложений на 64-битные платформы, поддержке параллельного программирования и так далее.
В этих задачах, стоящих уже перед многими программистами, возникает множество нюансов и проблем [2, 3].
В их диагностике могут помочь различные инструменты и методики [4].
В настоящей статье рассматривается один из подходов к диагностике проблем в коде 64-битных приложений.
А именно - разработка специализированного статического анализатора кода.
3. Статический анализатор кода состоит из двух частей:
компилятора переднего плана (front end compiler) - модуля, выполняющего разбор исходного кода,
лексический и синтаксический анализ, а также построение дерева разбора для дальнейшего анализа;
набора правил диагностики потенциально опасных конструкций.
Под потенциально опасными конструкциями будем понимать такие конструкции в коде программ, которые
при переносе приложения на 64-битную платформу могут привести к некорректной работе программ. Следует
не путать их с дефектами [5] в коде программ, которые являются ошибками и требуют исправления в любом
случае. В отличие от дефектов потенциально опасные конструкции, которые диагностирует статический
анализатор кода, должны быть просмотрены программистом. И уже программист принимает решение,
является ли данный код некорректным в конкретной ситуации. Если код признается программистом
некорректным, то он подлежит исправлению.
Таким образом, задача статического анализатора заключается в диагностике с помощью набора правил
потенциально опасных конструкций.
4. Разработка модуля анализа
Принципы построения статического анализатора кода хорошо изучены и приведены в литературе [6]. Поэтому
для реализации анализатора, предназначенного для разработки 64-битных приложений, следует выбрать
традиционный подход к построению модуля анализа.
Так как разрабатываемый анализатор кода предназначен для языков Си и Си++, то исходя из знаний о типе
этих языков программирования и нужно конструировать модуль анализа.
Язык Си++ задается контекстно-свободной (КС) грамматикой (классификация по Хомскому). Для разбора
программ на языке Си++ используется синтаксический анализатор, распознающий КС-грамматику.
Лексический же разбор реализован на основе регулярной грамматики. Необходимость и лексического, и
синтаксического разборов объясняется особенностью проверяемых правил.
Распознавание языка Си++ реализуется, методом рекурсивного спуска (рекурсивный нисходящий анализ) с
возвратом. Такое распознавание реализовано в библиотеке анализа кода VivaCore [7].
В результате разбора кода получается синтаксическое дерево разбора (derivation tree). Дерево разбора по
сравнению с абстрактным синтаксическим деревом (abstract syntax tree) содержит больше информации,
которая необходима в ряде случаев для дальнейшего анализа. После чего специальный алгоритм
осуществляет проход по дереву и выполняет проверку определенных правил.
5. Типы данных
Прежде чем говорить о каких-либо правилах диагностики потенциально опасных конструкций, необходимо
определится с архитектурой, для которой будут разрабатываться правила. Для нас наиболее важна такая
составляющая архитектуры, как модель данных. Модель данных [2] - это соотношение размеров основных
типов данных на конкретной архитектуре. Так, модель данных 64-битной архитектуры Windows называется
LLP64. В то время как для 64-битной архитектуры Linux применяется модель LP64. В дальнейшем все правила
будут приводиться для архитектуры LLP64, однако они абсолютно также применимы и к архитектуре LP64
после замены определений основных базовых типов.
Введем множество T - множество всех целочисленных базовых и производных от них типов языка C++, в том
числе указателей. Примеры int, bool, short int, size_t, void*, указатели на классы.
Введем множество S - множество размеров этих типов (в байтах), такое что Tt Ss . Примеры: 1, 2, 4, 8,
16, 32, 64.
Количество элементов в множествах T и S различно, элементов в T больше чем в S .
Введем операцию соответствия 32 , при которой тип языка C++ отображается в рамках 32-битной архитектуры
в размер этого типа: SsSt 32 , а также операцию 64 , при которой тип языка отображается в рамках 64-
битой архитектуры в размер этого типа: SsSt 64 . Формально операции выглядят так: ST :32 и
ST :64 .
6. Введем множество T- множество всех memsize-типов (типов переменной размерности) языка C++, TT .
Примеры size_t, ptrdiff_t, int*, void*.
Элементы множества T обладают тем свойством, что
Tt :
SsSt
SsSt
*
64
32
, *
ss .
Другими словами, memsize-типы - это StStTtTT 6432:, .
Введем множество TT 32 - это все типы данных, являющиеся 32-битными в рамках как 32-битной, так и 64-
битной архитектуры, т.е. StStTtTT 64323232323232 :, . Пример: int.
По аналогии введем множество TT 64 - это все типы данных, являющиеся 64-битными в рамках как 32-битной,
так и 64-битной архитектуры. Пример: long long.
7. Размеры всех memsize-типов на 32-битной архитектуре равны одному числу q =4 (4 байта):
SpTt , верно что qSt 64 . Размеры всех memsize-типов на 64-битной архитектуре равны числу *
q =8 (8
байт).
Введем множество P - типы данных "указатели" в языке C++, TP .
Введем операцию разыменования типа *
следующим образом:
TP :*
.
Данная операция предназначена для получения типа данных, на который указывает указатель: tp *
.
Пример: intint* *
.
Введем множество D , состоящее из всех типов, производных от типа double. Пример: double, long double.
8. Правила анализа корректности кода
Все правила анализа корректности кода представлены в виде функций, которые принимают некоторые
аргументы (разные для разных правил), а возвращают true в случае некорректного кода и false, в случае
корректного. Все правила составлены по результатам изучения и обработки ошибок переноса кода на 64-
битные платформы [2].
Приведение 32-битных целых типов к memsize-типам
Следует считать опасными конструкции явного и неявного приведения целых типов размерностью 32 бита к
memsize-типам.
Примеры:
unsigned a, c;
size_t b = a;
array[c] = 1;
.,
,,
),( 2321
211
иначеfalse
TtTtеслиtrue
ttF
9. Приведение memsize-типов к целым 32-битным типам
Следует считать опасными конструкции явного и неявного приведения memsize-типов к целым типам
размерностью 32 бита.
Пример:
size_t a;
unsigned b = a;
.,
,,
),( 3221
212
иначеfalse
TtTtеслиtrue
ttF
10. Memsize-типы в виртуальных функциях
Опасными следует считать виртуальную функцию, удовлетворяющую ряду условий.
а). Функция объявлена в базовом классе и в классе-потомке.
б). Типы аргументов функций не совпадают, но эквивалентны на 32-битной системе (например: unsigned,
size_t) и не эквивалентны на 64-битной.
Пример:
class Base {
virtual void foo(size_t);
};
class Derive : public Base {
virtual void foo(unsigned);
};
11. Рассмотрим кортежи 1M и 2M , представляющие собой наборы элементов из множества T . Ошибочной
следует считать ситуацию, при которой в 32-битном режиме кортежи 1M и 2M совпадают, а в 64-битном -
различны.
.,
,..1,)()()()(
)()()()(,
),(
642641322321
642641322321
213
иначеfalse
niSmSmSmSm
SmSmSmSmеслиtrue
MMF
iiii
iiii
12. Memsize-типы в перегруженных функциях
Опасными следует считать вызов перегруженных функций с аргументом типа memsize. При этом функции
должны быть перегружены для целых 32-х и 64-битных типов данных.
Пример:
void WriteValue(__int32);
void WriteValue(__int64);
...
ptrdiff_t value;
WriteValue(value);
13. Рассмотрим вызов функции c n фактическими аргументами. Если существует 2 или более перегруженных
функции с таким же количеством аргументов, то необходимо выполнить следующую проверку.
A - кортеж типов фактических параметров функции;
1A - кортеж типов формальных параметров первой перегруженной функции;
2A - кортеж типов формальных параметров второй перегруженной функции;
.,
,..1,)()()()()(,
),,( 641322642321
214
иначеfalse
niTaTaTaTaTaеслиtrue
AAAF iiiii
14. Приведение типов указателей на memsize-типы
Опасным следует считать явное приведение одного типа указателя к другому, если один из них ссылается на
32-/64-битный тип, а другой на memsize-тип.
Пример:
int *array;
size_t *sizetPtr = (size_t *)(array);
.,
,
,
),(
64322
*
11
*
2
64322
*
21
*
1
215
иначеfalse
TTtpTtp
TTtpTtpеслиtrue
ppF
Приведение memsize-типов к double
Опасным следует считать явные и неявные приведения memsize-типа к double и наоборот.
Пример:
size_t a;
double b = a;
.,
,,
),( 1221
216
иначеfalse
TtDtTtDtеслиtrue
ttF
15. Memsize-типы в функции с переменным количеством аргументов
Опасным следует считать передачу memsize-типа (кроме указаталей) в функцию с переменным количеством
аргументов.
Пример:
size_t a;
printf("%u", a);
Пусть K - кортеж всех фактических типов, которые являются параметрами функции с переменным
количеством аргументов. Пусть функция вызывается с m аргументами.
.,
,..1,/,
)(7
иначеfalse
miPTесли ktrue
KF i
16. Опасные константы
Опасным следует считать использование констант определенного вида. Введем множество N целых чисел,
которые можно записать средствами языка C++. Введем множество "опасных" констант NC . Примеры
"опасных" констант: 4, 32, 0xffffffff и т.д.
.,
,,
)(8
иначеfalse
Ccеслиtrue
cF
17. Memsize-типы в объединениях
Опасным следует считать наличие в объединениях (union) членов memsize-типов.
Пример:
union PtrNumUnion {
char *m_p;
unsigned m_n;
} u;
Все типы данных, входящие в union будем называть кортежем U .
.,
,,
)(9
иначеfalse
TUеслиtrue
UF
18. Исключения и memsize-типы
Опасным следует считать бросание и обработку исключений с использованием memsize-типов.
Пример:
char *p1, *p2;
try {
throw (p1 - p2);
}
catch (int) {
...
}
.,
,,
)(10
иначеfalse
Tесли ttrue
tF
19. Заключение
Рассмотренные в статье правила диагностики потенциально опасных конструкций с точки зрения 64-битных
приложений могут быть реализованы в любом статическом анализаторе кода.
Однако в настоящий момент они реализованы в полном виде лишь в анализаторе кода Viva64
(www.viva64.com). Программный продукт Viva64 обеспечивает диагностику ошибок, специфичных для 64-
битных Windows приложений. Viva64 представляет собой lint-подобный статический анализатор Си/Си++ кода.
Инструмент Viva64 интегрируется в среду разработки Visual Studio 2005/2008 и предоставляет удобный
пользовательский интерфейс для проверки программных проектов.
20. Литература
1. Scott Meyers, Martin Klaus "A First Look at C++ Program Analyzers.", 1997,
http://www.aristeia.com/ddjpaper1_frames.html.
2. Андрей Карпов, Евгений Рыжков. 20 ловушек переноса C++-кода на 64-битную платформу. RSDN
Magazine #1-2007. стр. 65 - 75.
3. Алексей Колосов, Евгений Рыжков, Андрей Карпов. 32 подводных камня OpenMP при
программировании на C++. RSDN Magazine #2-2008. стр. 3 - 17.
4. E. А. Рыжков, А.Н. Карпов. Подходы к верификации и тестированию 64-битных приложений.
"ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ" N7, 2008, Стр. 41 - 45.
5. Макконнелл С. Совершенный код. Мастер-класс / Пер. с англ.- М.: Издательство "Русская редакция",
СПб.: Питер, 2007.- 896 с.: ил.
6. Системное программное обеспечение / А.В. Гордеев, А.Ю. Молчанов. - СПб.: Питер, 2002. - 736 с:.ил.
7. Евгений Рыжков, Андрей Карпов. Сущность библиотеки анализа кода VivaCore. RSDN Magazine #1-2008.
стр. 56 - 63.