Хотя история развития 64-битных систем составляет более десятилетия, появление 64-битных версий операционной системы Windows поставило перед разработчиками новые задачи в области разработки и тестирования программных решений. В статье рассмотрены некоторые ошибки связанные с разработкой 64-битного Си/Си++ кода под операционную систему Windows. Объяснены причины, по которым данные ошибки не нашли отражения в статьях, посвященных задачам миграции и неудовлетворительно выявляются большинством статических анализаторов.
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров, перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После такого переноса кода приложение может вести себя некорректно. В статье рассматривается вопрос разработки и применения статического анализатора кода для проверки правильности таких приложений. Приводятся проблемы, возникающие в приложениях после перекомпиляции для 64-битных систем, а также правила, по которым выполняется проверка кода.
64 бита для Си++ программистов: от /Wp64 к Viva64Tatyanazaxarova
Развитие рынка 64-битных решений поставило новые задачи в области их верификации и тестирования. В статье говорится об одном из таких инструментов - Viva64. Это lint-подобный статический анализатор Си/Си++ кода, предназначенный специально для выявления ошибок, связанных с особенностями 64-битных платформ. Освещены предпосылки для создания данного анализатора и отражена его связь с режимом "Detect 64-Bit Portability Issues" в Си++ компиляторе Visual Studio 2005.
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019corehard_by
Мир изменился. То, что работало раньше, не то чтобы перестало работать, но стало недостаточным. Парное программирование, обзоры кода, юнит-тесты по-прежнему важны и необходимы, но они уже не могут обеспечить должного уровня качества и надёжности С++ проектов. Многие проекты выросли в сотни раз. Рост происходил постепенно, и еще не все поняли, что произошло. Любой большой старый проект состоит из разнородных слоёв (геологических отложений) и, самое главное, уже никто не знает, как это всё работает. Пришло время инструментов и методологий, помогающих сохранять качество и целостность кода: DevSecOps, статический анализ, динамический анализ, платформы измерения качества.
Исправление всех ошибок компиляции и предупреждений не будет означать работоспособность 64-битного приложения. И именно описанию и диагностике 64-битных ошибок будет посвящена основная часть уроков. Также не надейтесь на помощь ключа /Wp64, который многими часто без оснований преподносится при обсуждениях в форумах как чудесное средство поиска 64-битных ошибок.
Регулярное использование статического анализа кода в командной разработкеTatyanazaxarova
Технологии статического анализа кода применяются в компаниях со зрелыми процессами разработки программного обеспечения. Однако уровень применения и внедрения в процесс разработки инструментов анализа кода может быть различным. Начиная от ручного запуска анализатора "время от времени" или при поиске трудноуловимых ошибок, и кончая ежедневным автоматическим запуском или запуском при добавлении нового исходного кода в систему контроля версий.
В статье рассмотрены различные уровни использования технологий статического анализа кода в командной разработке, показано как "перевести" процесс с одного уровня на другой. В качестве примера в статье используется разрабатываемый авторами анализатор кода PVS-Studio.
The forgotten problems of 64-bit programs developmentPVS-Studio
Though the history of 64-bit systems development makes more than a decade, the appearance of 64-bit version of OS Windows raised new problems in the sphere of development and testing applications. In the article there are considered some mistakes connected with 64-bit C/C++ code development to OS Windows. The reasons are explained according to which these mistakes didn't find their reflection in the articles devoted to the migration tasks and are unsatisfactorily detected by the majority of static analyzers.
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров, перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После такого переноса кода приложение может вести себя некорректно. В статье рассматривается вопрос разработки и применения статического анализатора кода для проверки правильности таких приложений. Приводятся проблемы, возникающие в приложениях после перекомпиляции для 64-битных систем, а также правила, по которым выполняется проверка кода.
64 бита для Си++ программистов: от /Wp64 к Viva64Tatyanazaxarova
Развитие рынка 64-битных решений поставило новые задачи в области их верификации и тестирования. В статье говорится об одном из таких инструментов - Viva64. Это lint-подобный статический анализатор Си/Си++ кода, предназначенный специально для выявления ошибок, связанных с особенностями 64-битных платформ. Освещены предпосылки для создания данного анализатора и отражена его связь с режимом "Detect 64-Bit Portability Issues" в Си++ компиляторе Visual Studio 2005.
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019corehard_by
Мир изменился. То, что работало раньше, не то чтобы перестало работать, но стало недостаточным. Парное программирование, обзоры кода, юнит-тесты по-прежнему важны и необходимы, но они уже не могут обеспечить должного уровня качества и надёжности С++ проектов. Многие проекты выросли в сотни раз. Рост происходил постепенно, и еще не все поняли, что произошло. Любой большой старый проект состоит из разнородных слоёв (геологических отложений) и, самое главное, уже никто не знает, как это всё работает. Пришло время инструментов и методологий, помогающих сохранять качество и целостность кода: DevSecOps, статический анализ, динамический анализ, платформы измерения качества.
Исправление всех ошибок компиляции и предупреждений не будет означать работоспособность 64-битного приложения. И именно описанию и диагностике 64-битных ошибок будет посвящена основная часть уроков. Также не надейтесь на помощь ключа /Wp64, который многими часто без оснований преподносится при обсуждениях в форумах как чудесное средство поиска 64-битных ошибок.
Регулярное использование статического анализа кода в командной разработкеTatyanazaxarova
Технологии статического анализа кода применяются в компаниях со зрелыми процессами разработки программного обеспечения. Однако уровень применения и внедрения в процесс разработки инструментов анализа кода может быть различным. Начиная от ручного запуска анализатора "время от времени" или при поиске трудноуловимых ошибок, и кончая ежедневным автоматическим запуском или запуском при добавлении нового исходного кода в систему контроля версий.
В статье рассмотрены различные уровни использования технологий статического анализа кода в командной разработке, показано как "перевести" процесс с одного уровня на другой. В качестве примера в статье используется разрабатываемый авторами анализатор кода PVS-Studio.
The forgotten problems of 64-bit programs developmentPVS-Studio
Though the history of 64-bit systems development makes more than a decade, the appearance of 64-bit version of OS Windows raised new problems in the sphere of development and testing applications. In the article there are considered some mistakes connected with 64-bit C/C++ code development to OS Windows. The reasons are explained according to which these mistakes didn't find their reflection in the articles devoted to the migration tasks and are unsatisfactorily detected by the majority of static analyzers.
7 шагов по переносу программы на 64-битную системуTatyanazaxarova
В статье рассмотрены основные шаги, обеспечивающие корректный перенос 32-битных Windows приложений на 64-битные Windows системы. Хотя статья ориентирована на разработчиков, использующих язык Си/Си++ в среде Visual Studio 2005/2008, она будет полезна и другим разработчикам, планирующим перенос своих приложений под 64-битные системы.
Что же получили программисты с приходом 64-битных систем? Помимо многочисленных преимуществ, о которых написаны сотни и тысячи рекламных статей, программисты получили целый набор задачек, головоломок и даже ловушек, с которыми предстоит столкнуться всем, кто хочет получить реальные преимущества от переноса кода на 64-битные системы.
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarova
В статье производится сравнение специализированного статического анализатора Viva64 со статическими анализаторами общего назначения Parasoft C++test и Gimpel Software PC-Lint. Сравнение производится в рамках задачи переноса 32-битного Си/Си++ кода на 64-битные системы или разработки нового кода с учетом особенностей 64-битной архитектуры.
Разработка ресурсоемких приложений в среде Visual C++Tatyanazaxarova
Статья познакомит разработчиков прикладного программного обеспечения с задачами, которые ставит перед ними массовое внедрение многоядерных 64-битных вычислительных систем, знаменующих революционное увеличение вычислительной мощности, доступное рядовому пользователю. Будут рассмотрены вопросы эффективного использования аппаратных ресурсов для решения повседневных прикладных задач в рамках операционной системы Windows x64.
20 ловушек переноса Си++ - кода на 64-битную платформуTatyanazaxarova
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ - кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
Важным элементом переноса программного решения на новую платформу является преемственность к существующим протоколам обмена данными. Необходимо обеспечить чтение существующих форматов проектов, осуществлять обмен данными между 32-битными и 64-битными процессами и так далее.
Хочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
Инструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Tatyanazaxarova
В статье рассмотрена задача разработки программного инструмента под названием статический анализатор. Разрабатываемый инструмент используется для диагностики потенциально опасных синтаксических конструкций языка Си++ с точки зрения переноса программного кода на 64-битные системы. Акцент сделан не на самих проблемах переноса, возникающих в программах, а на особенностях создания специализированного анализатора кода. Анализатор предназначен для работы с кодом программ на языках Си и Си++.
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Andrey Karpov
Этот документ рекламирует статический анализатор PVS-Studio. Описывается, как использование PVS-Studio уменьшит количество ошибок в коде проекта на языке C/C++/C++11 и сократит затраты на тестирование, отладку и сопровождение кода. Приводится большое количество примеров ошибок, найденных анализатором в различных Open-Source проектах. Документ описывает PVS-Studio на момент версии 4.38 от 12 октября 2011 и, как следствие, не отражает возможности следующих версий. Чтобы познакомиться с новыми возможностями, предлагаем посетить сайт продукта <a>http://www.viva64.com</a> или поискать обновленный вариант этой статьи.
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
При разработке 64-битной версии приложения дополнительное внимание стоит уделить и вопросу дистрибуции программы. Ведь при установке на 64-битной операционной системе есть несколько нюансов, забыв о которых можно получить неработающий инсталляционный пакет.
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
Статья представляет собой наиболее полную коллекцию примеров 64-битных ошибок на языках Си и Си++. Статья ориентирована на разработчиков Windows-приложений, использующих Visual C++, но будет полезна и более широкой аудитории.
Статья знакомит разработчиков с библиотекой VivaCore, предпосылками ее создания, возможностями, структурой и областями применения. Данная статья была написана параллельно с разработкой библиотеки VivaCore, и поэтому отдельные детали ее конечной реализации могут отличаться от описанных здесь свойств. Но это не помешает разработчикам познакомиться с общими принципами работы библиотеки, механизмами анализа и обработки текстов программ на языке Си и Си++.
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
Статический анализ кода - методология выявления ошибок в программном коде, основанная на просмотре программистом участков кода, помеченных статическим анализатором. Помеченные участки кода с большой вероятностью содержат ошибки определенного типа.
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...Tatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После переноса кода приложения высока вероятность его некорректной работы. В статье рассмотрены вопросы, связанные с верификацией и тестированием программного обеспечения. Обозначены сложности, с которыми может столкнуться разработчик 64-битных Windows приложений и пути их преодоления.
Правила статического анализа кода для диагностики потенциально опасных констр...Sergey Vasilyev
В статье сформулированы правила диагностики потенциально опасных синтаксических конструкций в исходном коде программ на языке Си++. Описаны принципы построения статического анализатора исходного кода, реализующего проверку указанных правил.
В статье рассмотрен ряд вопросов связанных с тестированием 64-битного программного обеспечения. Обозначены сложности, с которыми может столкнуться разработчик ресурсоемких 64-битных приложений, и пути их преодоления.
После компиляции программы в 64-битном режиме она начинает потреблять большее количество памяти, чем ее 32-битный вариант. Часто это увеличение почти незаметно, но иногда потребление памяти может возрастать в 2 раза.
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
Данная статья содержит различные примеры 64-битных ошибок, собранные в демонстрационном примере PortSample. Однако, начиная с версии PVS-Studio 3.63, вместо PortSample в дистрибутив PVS-Studio включается более новая версия примеров, которая называется OmniSample. Поэтому некоторые скриншоты в статье не соответствуют актуальному состоянию дел.
Мы закончили рассмотрение паттернов 64-битных ошибок. Последнее на чем мы остановимся в связи с этими ошибками, является то, как они могут проявляться в программах.
More Related Content
Similar to Забытые проблемы разработки 64-битных программ
7 шагов по переносу программы на 64-битную системуTatyanazaxarova
В статье рассмотрены основные шаги, обеспечивающие корректный перенос 32-битных Windows приложений на 64-битные Windows системы. Хотя статья ориентирована на разработчиков, использующих язык Си/Си++ в среде Visual Studio 2005/2008, она будет полезна и другим разработчикам, планирующим перенос своих приложений под 64-битные системы.
Что же получили программисты с приходом 64-битных систем? Помимо многочисленных преимуществ, о которых написаны сотни и тысячи рекламных статей, программисты получили целый набор задачек, головоломок и даже ловушек, с которыми предстоит столкнуться всем, кто хочет получить реальные преимущества от переноса кода на 64-битные системы.
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarova
В статье производится сравнение специализированного статического анализатора Viva64 со статическими анализаторами общего назначения Parasoft C++test и Gimpel Software PC-Lint. Сравнение производится в рамках задачи переноса 32-битного Си/Си++ кода на 64-битные системы или разработки нового кода с учетом особенностей 64-битной архитектуры.
Разработка ресурсоемких приложений в среде Visual C++Tatyanazaxarova
Статья познакомит разработчиков прикладного программного обеспечения с задачами, которые ставит перед ними массовое внедрение многоядерных 64-битных вычислительных систем, знаменующих революционное увеличение вычислительной мощности, доступное рядовому пользователю. Будут рассмотрены вопросы эффективного использования аппаратных ресурсов для решения повседневных прикладных задач в рамках операционной системы Windows x64.
20 ловушек переноса Си++ - кода на 64-битную платформуTatyanazaxarova
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ - кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
Важным элементом переноса программного решения на новую платформу является преемственность к существующим протоколам обмена данными. Необходимо обеспечить чтение существующих форматов проектов, осуществлять обмен данными между 32-битными и 64-битными процессами и так далее.
Хочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
Инструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Tatyanazaxarova
В статье рассмотрена задача разработки программного инструмента под названием статический анализатор. Разрабатываемый инструмент используется для диагностики потенциально опасных синтаксических конструкций языка Си++ с точки зрения переноса программного кода на 64-битные системы. Акцент сделан не на самих проблемах переноса, возникающих в программах, а на особенностях создания специализированного анализатора кода. Анализатор предназначен для работы с кодом программ на языках Си и Си++.
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Andrey Karpov
Этот документ рекламирует статический анализатор PVS-Studio. Описывается, как использование PVS-Studio уменьшит количество ошибок в коде проекта на языке C/C++/C++11 и сократит затраты на тестирование, отладку и сопровождение кода. Приводится большое количество примеров ошибок, найденных анализатором в различных Open-Source проектах. Документ описывает PVS-Studio на момент версии 4.38 от 12 октября 2011 и, как следствие, не отражает возможности следующих версий. Чтобы познакомиться с новыми возможностями, предлагаем посетить сайт продукта <a>http://www.viva64.com</a> или поискать обновленный вариант этой статьи.
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
При разработке 64-битной версии приложения дополнительное внимание стоит уделить и вопросу дистрибуции программы. Ведь при установке на 64-битной операционной системе есть несколько нюансов, забыв о которых можно получить неработающий инсталляционный пакет.
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
Статья представляет собой наиболее полную коллекцию примеров 64-битных ошибок на языках Си и Си++. Статья ориентирована на разработчиков Windows-приложений, использующих Visual C++, но будет полезна и более широкой аудитории.
Статья знакомит разработчиков с библиотекой VivaCore, предпосылками ее создания, возможностями, структурой и областями применения. Данная статья была написана параллельно с разработкой библиотеки VivaCore, и поэтому отдельные детали ее конечной реализации могут отличаться от описанных здесь свойств. Но это не помешает разработчикам познакомиться с общими принципами работы библиотеки, механизмами анализа и обработки текстов программ на языке Си и Си++.
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
Статический анализ кода - методология выявления ошибок в программном коде, основанная на просмотре программистом участков кода, помеченных статическим анализатором. Помеченные участки кода с большой вероятностью содержат ошибки определенного типа.
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...Tatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После переноса кода приложения высока вероятность его некорректной работы. В статье рассмотрены вопросы, связанные с верификацией и тестированием программного обеспечения. Обозначены сложности, с которыми может столкнуться разработчик 64-битных Windows приложений и пути их преодоления.
Правила статического анализа кода для диагностики потенциально опасных констр...Sergey Vasilyev
В статье сформулированы правила диагностики потенциально опасных синтаксических конструкций в исходном коде программ на языке Си++. Описаны принципы построения статического анализатора исходного кода, реализующего проверку указанных правил.
В статье рассмотрен ряд вопросов связанных с тестированием 64-битного программного обеспечения. Обозначены сложности, с которыми может столкнуться разработчик ресурсоемких 64-битных приложений, и пути их преодоления.
После компиляции программы в 64-битном режиме она начинает потреблять большее количество памяти, чем ее 32-битный вариант. Часто это увеличение почти незаметно, но иногда потребление памяти может возрастать в 2 раза.
Similar to Забытые проблемы разработки 64-битных программ (20)
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
Данная статья содержит различные примеры 64-битных ошибок, собранные в демонстрационном примере PortSample. Однако, начиная с версии PVS-Studio 3.63, вместо PortSample в дистрибутив PVS-Studio включается более новая версия примеров, которая называется OmniSample. Поэтому некоторые скриншоты в статье не соответствуют актуальному состоянию дел.
Мы закончили рассмотрение паттернов 64-битных ошибок. Последнее на чем мы остановимся в связи с этими ошибками, является то, как они могут проявляться в программах.
Сам по себе рост размера структур не является ошибкой, но может приводить к потреблению необоснованного количества памяти и в результате к замедлению скорости работы программы. Будем рассматривать данный паттерн не как ошибку, но как причину неэффективности 64-битного кода.
Процессоры работают эффективнее, когда имеют дело с правильно выровненными данными. А некоторые процессоры вообще не умеют работать с не выровненными данными.
Генерирование и обработка исключений с участием целочисленных типов не является хорошей практикой программирования на языке Си++. Для этих целей следует использовать более информативные типы, например классы, производные от класса std::exception.
Надеемся, вы уже успели отдохнуть от 13 урока и теперь сможете рассмотреть еще один важный паттерн ошибок, связанный с арифметическими выражениями, в которых участвуют типы различной размерности.
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarova
Особенностью объединения (union) является то, что для всех элементов (членов) объединения выделяется одна и та же область памяти, то есть они перекрываются. Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат был осмысленным.
Большое количество ошибок при миграции на 64-битные системы связано с изменением соотношения между размером указателя и размером обычных целых. В среде с моделью данных ILP32 обычные целые и указатели имеют одинаковый размер. К сожалению, 32-битный код повсеместно опирается на это предположение. Указатели часто приводятся к int, unsigned, long, DWORD и другим неподходящим типам.
Мы специально выбрали номер "тринадцать" для этого урока, поскольку ошибки, связанные с адресной арифметикой в 64-битных системах, являются наиболее коварными. Надеемся, число 13 заставит вас быть внимательнее.
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
Классическими примерами, приводимыми во многих статьях по проблемам переноса программ на 64-битные системы, является некорректное использование функций printf, scanf и их разновидностей.
В некачественном коде часто встречаются магические числовые константы, наличие которых опасно само по себе. При миграции кода на 64-битную платформу эти константы могут сделать код неработоспособным, если участвуют в операциях вычисления адреса, размера объектов или в битовых операциях.
Вначале следует убедиться, что используемая вами редакция Visual Studio позволяет собирать 64-битный код. Если вы планируете разрабатывать 64-битные приложения с использованием последней версии (на момент написания курса) Visual Studio 2008, то следующая таблица поможет определить, какая из редакций Visual Studio вам необходима.
Мы все допускаем ошибки при программировании и тратим массу времени на их устранение.
Один из методов который позволяет быстро диагностировать дефекты – статический анализ исходного кода.
PVS-Studio - статический анализатор, выявляющий ошибки в исходном коде приложений на языке C/C++/C++0x. Можно выделить 3 набора правил, включенных в состав PVS-Studio:
1. Диагностика 64-битных ошибок (Viva64)
2. Диагностика параллельных ошибок (VivaMP)
3. Диагностика общего назначения
PVS-Studio научился следить за тем, как вы программируетеTatyanazaxarova
В PVS-Studio появился режим работы, который поможет максимально рано выявлять ошибки и опечатки. Анализатор запускается сразу после компиляции файлов и если что-то не так, покраснеет от стыда за ваш код. Фича доступна на данный момент только для пользователей Visual Studio 2010.
Многим читателя понравилась моя статья "Последствия использования технологии Copy-Paste при программировании на Си++ и как с этим быть" [1]. Обратил на неё внимание и Scott Meyers [2] и задал вопрос о том, как же собственно статический анализ помог выявить описанные в статье ошибки.
Использование анализатора 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.
Я регулярно общаюсь с потенциальными пользователями, озабоченными ошибками в программах на языке Си++. Их озабоченность выражается в том, что они пробуют инструмент PVS-Studio и начинают писать о том, что при испытаниях что-то подозрительно мало ошибок было найдено. И хотя, вроде чувствуется, что инструмент им интересен, их реакция полна скептицизма.
1. Забытые проблемы разработки 64-
битных программ
Автор: Андрей Карпов
Дата: 11.08.2007
Аннотация
Хотя история развития 64-битных систем составляет более десятилетия, появление 64-битных
версий операционной системы Windows поставило перед разработчиками новые задачи в
области разработки и тестирования программных решений. В статье рассмотрены некоторые
ошибки связанные с разработкой 64-битного Си/Си++ кода под операционную систему Windows.
Объяснены причины, по которым данные ошибки не нашли отражения в статьях, посвященных
задачам миграции и неудовлетворительно выявляются большинством статических анализаторов.
Введение
История развития 64-битных программных систем не нова и составляет уже более десятилетия [1].
В 1991 году был выпущен первый 64-битный микропроцессор MIPS R4000 [2, 3]. С тех пор в
форумах и статьях возникали дискуссии, посвященные переносу программ на 64-битные системы.
Началось обсуждение проблем, связанных с разработкой 64-битных программ на языке Си.
Обсуждались вопросы о том, какая модель данных лучше, что такое long long и многое другое.
Вот, например, интересная подборка сообщений [4] из новостной группы comp.lang.c,
посвященная использованию типа long long в языке Си, которая, в свою очередь, была связана с
появлением 64-битных систем.
Одним из наиболее распространенных и чувствительных к изменению размерности типов данных
является язык Си. Из-за его низкоуровневых свойств следует постоянно контролировать
корректность программы на этом языке, переносимой на новую платформу. Естественно, что при
появлении 64-битных систем разработчики по всему миру вновь столкнулись с задачами
обеспечения совместимости старого исходного кода с новыми системами. Одним из косвенных
свидетельств сложности проблем миграции является большое количество моделей данных,
которые постоянно следует учитывать. Модель данных - это соотношение размеров базовых
типов в языке программирования. На рисунке 1 показаны размерность типов в различных
моделях данных, на которые мы в дальнейшем будем ссылаться.
2. Рисунок 1. Модели данных.
Существующие публикации и инструменты в сфере верификации
64-битных приложений
Конечно, это был не первый этап смены разрядности. Достаточно вспомнить переход с 16-битных
систем на 32-битные. Естественно, накопленный опыт оказал свое положительное воздействие на
этапе перехода на 64-битные системы.
Но переход на 64-битные системы имел свои нюансы, в результате чего появилась серия
исследований и публикаций по данным вопросам, например [5, 6, 7].
В основном, авторами того времени выделялись ошибки следующих типов:
1. Упаковка указателей в типы меньшей размерности. Например, помещение указателя в тип
int на системе с моделью данных LP64 приведет к обрезанию значения указателя и
невозможности его использования в дальнейшем.
2. Использование магических констант. Опасность заключается в использовании таких чисел
как 4, 32, 0x80000000 и ряда других вместо специализированных констант или
использования оператора sizeof().
3. Некорректные операции сдвига, не учитывающие увеличение размерности ряда типов.
4. Использование некорректных объединений или структур без учета выравнивания на
системах с различной разрядностью.
5. Ошибки работы с битовыми полями.
6. Некорректные арифметические выражения. Пример:
int x = 100000, y = 100000, z = 100000;
long long s = x * y * x;
3. Кроме ошибок, перечисленных в списке, также рассматривались и некоторые другие, более
редкие ошибки.
На основе проведенных исследований вопроса верификации 64-битного кода были предложены
решения, обеспечивающие диагностику опасных конструкций. Например, такую проверку
реализовали в статических анализаторах Gimpel Software PC-Lint (http://www.gimpel.com) и
Parasoft C++test (http://www.parasoft.com).
Возникает вопрос. Если 64-битные системы существуют так давно, существуют статьи,
посвященные данной тематике, и даже программные инструменты, обеспечивающие контроль
опасных конструкций в коде, так стоит ли возвращаться к этому вопросу?
К сожалению да - стоит! Причиной тому служит прогресс, произошедший за эти годы в области
информационных технологий. А актуальность данного вопроса связана с быстрым
распространением 64-битных версий операционной системы Windows.
Существующая информационная поддержка и инструменты в области разработки 64-битных
технологий устарели и нуждаются в существенной переработке. Но Вы возразите, что в Интернете
можно найти множество современных статей (2005-2007г), посвященных вопросам разработки 64-
битных приложений на языке Си/Си++. К сожалению, на практике они являются не более чем
пересказом старых статей применительно к новой 64-битной версии Windows, без учета ее
специфики и произошедших изменений технологий.
Неосвещенные проблемы разработки 64-битных программ
Начнем по порядку. Авторы новых статей не учитывают огромный объем памяти, который стал
доступен современным приложениям. Конечно, указатели были 64-битными еще в стародавние
времена, но вот использовать таким программам массивы размером в несколько гигабайт не
доводилось. В результате, как в старых, так и в новых статьях выпал целый пласт ошибок,
связанный с ошибками индексации больших массивов. Практически невозможно найти в статьях
описание ошибки, подобной следующей:
for (int x = 0; x != width; ++x)
for (int y = 0; y != height; ++y)
for (int z = 0; z != depth; ++z)
BigArray[z * width * height + y * width + x] = InitValue;
В этом примере, выражение "z * width * height + y * width + x", используемое для адресации,
имеет тип int, а, следовательно, данный код будет некорректен на массивах, содержащих более 2
GB элементов. На 64-битных системах для безопасной индексации к большим массивам следует
использовать типы ptrdiff_t, size_t или производные от них. Отсутствие описания такого вида
ошибки в статьях объясняется очень просто. Во времена их написания машины с объемом памяти,
позволяющим хранить такие массивы, были практически не доступны. Сейчас же это становится
рядовой задачей в программировании, и с большим удивлением можно наблюдать, как код,
верой и правдой служивший многие годы, вдруг перестает корректно работать при использовании
больших массивов данных на 64-битных системах.
4. Другой пласт практически неосвещенных проблем, представлен ошибками, связанными с
возможностями и особенностями языка Си++. Почему так произошло, тоже достаточно
объяснимо. Во время внедрения первых 64-битных систем язык Си++ для них не существовал или
он был не распространен. Поэтому, практически все статьи посвящены проблемам в области
языка Си. Современные авторы заменили название Си на Си/Си++, но нового ничего не добавили.
Но отсутствие в статьях описания ошибок, специфичных для Си++, не означает, что их нет.
Существуют ошибки, проявляющие себя при переносе программ на 64-битные системы. Они
связанны с виртуальными функциями, исключениями, перегруженными функциями и так далее.
Более подробно с такими ошибками можно ознакомиться в статье [8]. Приведем простой пример,
связанный с использованием виртуальных функций:
class CWinApp {
...
virtual void WinHelp(DWORD_PTR dwData, UINT nCmd);
};
class CSampleApp : public CWinApp {
...
virtual void WinHelp(DWORD dwData, UINT nCmd);
};
Проследим жизненный цикл разработки некоторого приложения. Пусть первоначально оно
разрабатывалось под Microsoft Visual C++ 6.0, когда функция WinHelp в классе CWinApp имела
следующий прототип:
virtual void WinHelp(DWORD dwData, UINT nCmd = HELP_CONTEXT);
Совершенно верно было осуществить перекрытие виртуальной функции в классе CSampleApp, как
показано в примере. Затем проект был перенесен в Microsoft Visual C++ 2005, где прототип
функции в классе CWinApp претерпел изменения, заключающиеся в смене типа DWORD на тип
DWORD_PTR. На 32-битной системе программа продолжит совершенно корректно работать, так
как здесь типы DWORD и DWORD_PTR совпадают. Неприятности проявят себя при компиляции
данного кода под 64-битную платформу. Получатся две функции с одинаковыми именами, но с
различными параметрами, в результате чего перестанет вызываться пользовательский код.
Помимо особенностей разработки 64-битных программ с точки зрения языка Си++, существуют и
другие тонкие моменты. Например, особенности, связанные с архитектурой 64-битной версии
Windows. Хочется заранее предупредить разработчиков о потенциальных проблемах и
порекомендовать уделить большее внимание тестированию 64-битного программного
обеспечения [9].
Теперь вернемся к методам верификации исходного кода программы с использованием
статических анализаторов. Я думаю, вы уже угадали, что здесь тоже не все так хорошо, как
кажется. Несмотря на заявленную поддержку диагностирования особенностей 64-битного кода,
эта поддержка на данный момент не удовлетворяет необходимым требованиям. Причина
5. заключается в том, что диагностические правила были созданы по все тем же статьям, не
учитывающим специфику языка Си++ или обработку больших массивов данных, превышающих 2
GB.
Для Windows-разработчиков дело обстоит еще хуже. Основные статические анализаторы
рассчитаны на диагностику 64-битных ошибок для модели данных LP64, в то время как в Windows
используется модель данных LLP64 [10]. Обусловлено это тем, что 64-битные версии Windows
молоды, а ранее 64-битные системы были представлены Unix-подобными системами с моделью
данных LP64.
В качестве примера рассмотрим диагностическое сообщение 3264bit_IntToLongPointerCast (port-
10), генерируемое анализатором Parasoft C++test:
int *intPointer;
long *longPointer;
longPointer = (long *)intPointer; //-ERR port-10
C++test предполагает, что с точки зрения модели LP64 данная конструкция будет некорректна. Но
в рамках модели данных, принятой в Windows, данная конструкция будет безопасна.
Рекомендации по верификации 64-битных программ
Хорошо, - скажете Вы, - проблемы разработки 64-битных версий программ действительно
актуальны. Но как найти все эти ошибки?
Исчерпывающий ответ дать невозможно, но можно привести ряд рекомендаций, которые в сумме
позволят обеспечить безопасную миграцию на 64-битные системы и обеспечить необходимый
уровень надежности:
• Ознакомьте Ваших коллег, связанных с разработкой 64-битых приложений, со
следующими статьями: [7, 8, 9, 10, 11, 12, 13, 14, 15].
• Ознакомьте Ваших коллег с методологией статического анализа кода: [16, 17, 18].
Статическая верификация кода - один из лучших способов поиска такого рода ошибок. Она
позволяет убедиться в работоспособности даже тех частей кода, работу которых на
больших объемах данных сложно смоделировать в реальности, например, при
использовании методологии юнит-тестов.
• Разработчикам будет полезно познакомиться со статическими анализаторами, такими как
Parasoft C++test (www.parasoft.com), Gimpel Software PC-lint (www.gimpel.com), Abraxas
Software CodeCheck (www.abxsoft.com).
• Для разработчиков Windows-приложений особенно полезно будет знакомство со
специализированным статическим анализатором Viva64 (http://www.viva64.com),
рассчитанным на модель данных LLP64 [19].
• Усовершенствуйте систему юнит-тестирования, включив в набор тестов обработку
больших массивов данных. Более подробно с необходимостью тестирования на большом
объеме данных можно познакомиться в статье [9], а также узнать, как лучше организовать
такое тестирование.
• Провести тщательно ручное тестирование перенесенного кода на реальных больших
задачах, использующих возможности 64-битных систем. Смена архитектуры слишком
6. существенное изменение, чтобы полностью положиться на автоматизированные системы
тестирования.
Библиографический список
1. John R. Mashey, The Long Road to 64 Bits.
http://www.viva64.com/go.php?url=20
2. Wikipedia: MIPS architecture.
http://www.viva64.com/go.php?url=21
3. John R. Mashey, 64 bit processors: history and rationale.
http://www.viva64.com/go.php?url=22
4. John R. Mashey, The 64-bit integer type "long long": arguments and history.
http://www.viva64.com/go.php?url=23
5. 64-bit and Data Size Neutrality.
http://www.viva64.com/go.php?url=6
6. 64-Bit Programming Models: Why LP64?
http://www.viva64.com/go.php?url=24
7. Transitioning C and C++ programs to the 64-bit data model.
8. Andrey Karpov, Evgeniy Ryzhkov. 20 issues of porting C++ code on the 64-bit platform.
http://www.viva64.com/art-1-1-1958348565.html
9. Andrey Karpov. Evgeniy Ryzhkov. Problems of testing 64-bit applications.
http://www.viva64.com/art-1-1-929024801.html
10. The Old New Thing: Why did the Win64 team choose the LLP64 model?
http://www.viva64.com/go.php?url=25
11. Brad Martin, Anita Rettinger, and Jasmit Singh. Multiplatform Porting to 64 Bits.
http://www.viva64.com/go.php?url=26
12. Migrating 32-bit Managed Code to 64-bit.
http://www.viva64.com/go.php?url=27
13. Matt Pietrek. Everything You Need To Know To Start Programming 64-Bit Windows Systems.
http://www.viva64.com/go.php?url=28
14. Microsoft Game Technology Group. 64-bit programming for Game Developers.
http://www.viva64.com/go.php?url=29
15. John Paul Mueller. 24 Considerations for Moving Your Application to a 64-bit Platform.
http://www.viva64.com/go.php?url=30
16. Wikipedia: Static code analysis.
http://www.viva64.com/go.php?url=31
17. Sergei Sokolov. Bulletproofing C++ Code.
http://www.viva64.com/go.php?url=32
18. Walter W. Schilling, Jr. and Mansoor Alam. Integrate Static Analysis Into a Software
Development Process.
http://www.viva64.com/go.php?url=33
19. Evgeniy Ryzhkov. Viva64: what is it and for whom is it meant?
http://viva64.com/art-1-1-2081052208.html