Статья представляет собой отчет о проверки библиотеки Loki на совместимость с 64-битными системами с помощью анализатора кода Viva64 компании ООО "СиПроВер". Содержатся рекомендации пользователям библиотеки. Статья будет полезна также пользователям других библиотек, построенных на шаблонах, так как раскрывает особенности анализа подобных библиотек.
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
Правила статического анализа кода для диагностики потенциально опасных констр...Sergey Vasilyev
В статье сформулированы правила диагностики потенциально опасных синтаксических конструкций в исходном коде программ на языке Си++. Описаны принципы построения статического анализатора исходного кода, реализующего проверку указанных правил.
Разница в подходах анализа кода компилятором и выделенным инструментом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++, но будет полезна и более широкой аудитории.
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
Правила статического анализа кода для диагностики потенциально опасных констр...Sergey Vasilyev
В статье сформулированы правила диагностики потенциально опасных синтаксических конструкций в исходном коде программ на языке Си++. Описаны принципы построения статического анализатора исходного кода, реализующего проверку указанных правил.
Разница в подходах анализа кода компилятором и выделенным инструментом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++, но будет полезна и более широкой аудитории.
Построение компилятора на базе LLVM — Павел СычевYandex
Мы поговорим про компиляторы и их архитектуру. Обсудим, что же такое LLVM и зачем он нам нужен. Также рассмотрим, как написать компилятор простого языка программирования на LLVM.
Сергій Комлач
— Android розробник в Sticky Password (Чехія).
— Головні напрямки роботи — біометрична ідентифікація, кібер-безпека, кросс-платформенні рішення.
— Досвід у сфері розробки під Мобайл понад 8 років.
— Переможець Opera Mobile Store Awards.
— Спікер та учасник: Lviv Mobile Development Day, UAMobile, Frameworks Day Android, Code'n'Coffee Khmelnitsky, Google DevFest UA.
— Засновник та лідер Google Developers Group Kremenchuk.
Статья знакомит разработчиков с библиотекой VivaCore, предпосылками ее создания, возможностями, структурой и областями применения. Данная статья была написана параллельно с разработкой библиотеки VivaCore, и поэтому отдельные детали ее конечной реализации могут отличаться от описанных здесь свойств. Но это не помешает разработчикам познакомиться с общими принципами работы библиотеки, механизмами анализа и обработки текстов программ на языке Си и Си++.
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
Сергей Комлач
Занимается разработкой под мобильные платформы более 8-ми лет. Последние 2 года занимает должность старшего Android разработчика. Ведет курс разработки по Android в рамках Google Android Study . Докладчик на UAMobile 2014 (Kiev) , Lviv Mobile Developers Day 2014 , Google Developers Fest (2014, Lviv) , MobileOptimized (Minsk). Соорганизатор GDG Kremenchuk .
Статический анализ Си++ кода и новый стандарт языка C++0xTatyanazaxarova
В статье рассмотрены новые возможности языка Си++, описанные в стандарте C++0x и поддержанные в Visual Studio 2010. На примере PVS-Studio рассмотрено, как изменения языка отразятся на инструментах статического анализа кода.
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
Теория языков программирования (немного об интерпретаторах, триадах, оптимизации, парсерах и прочее)
Compilers construction some lectures of whole course, it covers some methods on interpreters, optimisations, antlr, dsl (introduction)
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
Доклад посвящён преимуществам и недостаткам C++ в сравнении с C и ассемблером в контексте разработки критичных к производительности библиотек, использующих специфичные для платформы возможности. На примерах реализации оптимизированных компонентов аудио- и видеокодеков мы рассмотрим, как можно упростить исходный код с помощью нестандартных расширений компилятора и новых возможностей C++11. Внимание также будет уделено функциональности, которой не хватает в текущих реализациях компилятора. В качестве целевых платформ используются ARMv7+NEON/ARM64, но предварительного знакомства с ними не требуется.
Иван Кочуркин. Теория и практика парсинга формальных языковMskDotNet Community
В докладе рассказывается об инструментах и практиках парсинга формальных языков: как исходного кода, так и собственных предметно-ориентированных (DSL). О том, какие бывают парсеры и проблемы при их использовании. Доклад повествует как о базовых вещах: о токенах, деревьях разбора, абстрактных синтаксических деревьях (AST), так и о продвинутых: о методах обработки препроцессорных директив и восстановления от ошибок, о парсинге островных, нечувствительных к регистру языков и фрагментов кода. Помимо парсинга в докладе затрагивается тема обработки древовидных структур. Материал доклада основан на практических задачах и акцентирован на технологиях ANTLR и Roslyn.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
Title: Cifrado de punto a punto en HTML5 con KHTML
Autor: Eduardo Robles
http://edulix.wordpress.com/
Akademy-es 2010
http://es.kde.org/akademy-es2010
License: CC-BY-SA
http://creativecommons.org/licenses/by-sa/3.0/
Построение компилятора на базе LLVM — Павел СычевYandex
Мы поговорим про компиляторы и их архитектуру. Обсудим, что же такое LLVM и зачем он нам нужен. Также рассмотрим, как написать компилятор простого языка программирования на LLVM.
Сергій Комлач
— Android розробник в Sticky Password (Чехія).
— Головні напрямки роботи — біометрична ідентифікація, кібер-безпека, кросс-платформенні рішення.
— Досвід у сфері розробки під Мобайл понад 8 років.
— Переможець Opera Mobile Store Awards.
— Спікер та учасник: Lviv Mobile Development Day, UAMobile, Frameworks Day Android, Code'n'Coffee Khmelnitsky, Google DevFest UA.
— Засновник та лідер Google Developers Group Kremenchuk.
Статья знакомит разработчиков с библиотекой VivaCore, предпосылками ее создания, возможностями, структурой и областями применения. Данная статья была написана параллельно с разработкой библиотеки VivaCore, и поэтому отдельные детали ее конечной реализации могут отличаться от описанных здесь свойств. Но это не помешает разработчикам познакомиться с общими принципами работы библиотеки, механизмами анализа и обработки текстов программ на языке Си и Си++.
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
Сергей Комлач
Занимается разработкой под мобильные платформы более 8-ми лет. Последние 2 года занимает должность старшего Android разработчика. Ведет курс разработки по Android в рамках Google Android Study . Докладчик на UAMobile 2014 (Kiev) , Lviv Mobile Developers Day 2014 , Google Developers Fest (2014, Lviv) , MobileOptimized (Minsk). Соорганизатор GDG Kremenchuk .
Статический анализ Си++ кода и новый стандарт языка C++0xTatyanazaxarova
В статье рассмотрены новые возможности языка Си++, описанные в стандарте C++0x и поддержанные в Visual Studio 2010. На примере PVS-Studio рассмотрено, как изменения языка отразятся на инструментах статического анализа кода.
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
Теория языков программирования (немного об интерпретаторах, триадах, оптимизации, парсерах и прочее)
Compilers construction some lectures of whole course, it covers some methods on interpreters, optimisations, antlr, dsl (introduction)
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
Доклад посвящён преимуществам и недостаткам C++ в сравнении с C и ассемблером в контексте разработки критичных к производительности библиотек, использующих специфичные для платформы возможности. На примерах реализации оптимизированных компонентов аудио- и видеокодеков мы рассмотрим, как можно упростить исходный код с помощью нестандартных расширений компилятора и новых возможностей C++11. Внимание также будет уделено функциональности, которой не хватает в текущих реализациях компилятора. В качестве целевых платформ используются ARMv7+NEON/ARM64, но предварительного знакомства с ними не требуется.
Иван Кочуркин. Теория и практика парсинга формальных языковMskDotNet Community
В докладе рассказывается об инструментах и практиках парсинга формальных языков: как исходного кода, так и собственных предметно-ориентированных (DSL). О том, какие бывают парсеры и проблемы при их использовании. Доклад повествует как о базовых вещах: о токенах, деревьях разбора, абстрактных синтаксических деревьях (AST), так и о продвинутых: о методах обработки препроцессорных директив и восстановления от ошибок, о парсинге островных, нечувствительных к регистру языков и фрагментов кода. Помимо парсинга в докладе затрагивается тема обработки древовидных структур. Материал доклада основан на практических задачах и акцентирован на технологиях ANTLR и Roslyn.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
Title: Cifrado de punto a punto en HTML5 con KHTML
Autor: Eduardo Robles
http://edulix.wordpress.com/
Akademy-es 2010
http://es.kde.org/akademy-es2010
License: CC-BY-SA
http://creativecommons.org/licenses/by-sa/3.0/
Este documento trata sobre la anatomía y fisiología del oído, los diferentes tipos de protectores auditivos básicos como tapones, orejeras y arcos aurales, así como instrucciones sobre su uso, limpieza y conservación. Explica también los daños y lesiones relacionadas con la exposición prolongada al ruido y la importancia de la prevención para proteger la audición.
El documento presenta resúmenes de cinco películas: Dos Pavos en Apuros, una película infantil sobre dos pavos que viajan en el tiempo para cambiar la historia de Acción de Gracias; La Batalla del Año, un drama sobre un equipo de baile urbano; Amor Índigo, un drama romántico basado en la novela "La Espuma de los Días"; Bajo Cero, una película de acción sobre un asesino en serie en Alaska; y Tips, un documento con consejos para fomentar la creativ
Un blog es un sitio web que recopila cronológicamente textos o artículos de uno o varios autores. Los blogs presentan las historias en orden cronológico inverso, permiten comentarios de lectores, clasifican la información por fecha, categorías y etiquetas, e incluyen listas de enlaces y la posibilidad de diálogo entre autores y lectores.
Title: Desktop4ALL, acceso a escritorios a través de clientes ligeros
Autor: Xavier González
Akademy-es 2010
http://es.kde.org/akademy-es2010
License: CC-BY-SA
http://creativecommons.org/licenses/by-sa/3.0/
El documento presenta tres películas: Superman: El Hombre de Acero, Zambezia y El Gran Gatsby. Superman: El Hombre de Acero cuenta la historia de Clark Kent y su descubrimiento de que posee poderes especiales que debe usar para proteger a los demás. Zambezia es una película infantil que sigue a Kai, un halcón joven, en su viaje para unirse a los defensores de la Ciudad de Pájaros de Zambezia. El Gran Gatsby explora la historia de Gatsby, un millonario m
El documento presenta información sobre varios proyectos y lanzamientos relacionados con la tecnología y los medios de comunicación en Paraguay, incluyendo la aprobación de una ley que valida la firma digital, el lanzamiento de un nuevo sitio web para el diario ABC con características de Web 2.0, y el lanzamiento del primer portal de noticias para teléfonos móviles en Paraguay llamado iABC.
Исправление всех ошибок компиляции и предупреждений не будет означать работоспособность 64-битного приложения. И именно описанию и диагностике 64-битных ошибок будет посвящена основная часть уроков. Также не надейтесь на помощь ключа /Wp64, который многими часто без оснований преподносится при обсуждениях в форумах как чудесное средство поиска 64-битных ошибок.
В лекции рассказано о доступных средствах по отладке веб-сайтов, их возможностях, а также способах их использования. Также речь пойдет о том, как искать ошибки у пользователей в продакшене и контролировать качество продукта.
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...Tatyanazaxarova
Данная статья представляет интерес для разработчиков, использующих или планирующих использовать библиотеку OpenC++ (OpenCxx). Автор рассказывает о своем опыте улучшения библиотеки OpenC++ и модификации библиотеки для решения специализированных задач.
Краткое описание библиотеки анализа кода VivaCoreTatyanazaxarova
Наша команда, занимаясь исследованиями в области статического анализа и работая над созданием инструмента Viva64, пришла к выводу, что большая часть разработанных структур и алгоритмов может быть выделена в библиотеку и использована сторонними разработчиками для создания новых программных продуктов. Эта библиотека получила название VivaCore.
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
Сегодня я хочу посвятить пост тематике, почему инструменты анализа исходного кода полезны вне зависимости от уровня знаний и опыта программиста. А польза такого анализа будет продемонстрирована на примере инструмента, который известен всем программистам - WinMerge.
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров, перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После такого переноса кода приложение может вести себя некорректно. В статье рассматривается вопрос разработки и применения статического анализатора кода для проверки правильности таких приложений. Приводятся проблемы, возникающие в приложениях после перекомпиляции для 64-битных систем, а также правила, по которым выполняется проверка кода.
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
Это моя очередная заметка о том, как PVS-Studio делает программы более надёжными. То есть где, и какие ошибки он обнаруживает. На этот раз под молоток попали примеры, демонстрирующие работу с библиотекой IPP 7.0 (Intel Performance Primitives Library).
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Как не подавиться большим старым проектомAndrey Karpov
Мир изменился. То, что работало раньше, не то чтобы перестало работать, но стало недостаточным. Парное программирование, обзоры кода, юнит-тесты по-прежнему важны и необходимы, но они уже не могут обеспечить должного уровня качества и надёжности С++ проектов. Многие проекты выросли в сотни раз. Рост происходил постепенно, и еще не все поняли, что произошло. Любой большой старый проект состоит из разнородных слоёв (геологических отложений) и, самое главное, уже никто не знает, как это всё работает. Пришло время инструментов и методологий, помогающих сохранять качество и целостность кода: DevSecOps, статический анализ, динамический анализ, платформы измерения качества.
Как не подавиться большим старым проектом. Юрий Минаев ➠ CoreHard Autumn 2019corehard_by
Мир изменился. То, что работало раньше, не то чтобы перестало работать, но стало недостаточным. Парное программирование, обзоры кода, юнит-тесты по-прежнему важны и необходимы, но они уже не могут обеспечить должного уровня качества и надёжности С++ проектов. Многие проекты выросли в сотни раз. Рост происходил постепенно, и еще не все поняли, что произошло. Любой большой старый проект состоит из разнородных слоёв (геологических отложений) и, самое главное, уже никто не знает, как это всё работает. Пришло время инструментов и методологий, помогающих сохранять качество и целостность кода: DevSecOps, статический анализ, динамический анализ, платформы измерения качества.
Рано или поздно возникает необходимость в собственных инструментах по разным причинам: либо не хватает готовых, либо есть какая-то особенность в проекте. Разработка инструментов, работающих в браузере, является непростой задачей. Самое сложное — чтобы они умели работать удаленно, вне страницы. Это многих пугает — нужно много сделать и во многом разобраться. Но если большая часть проблем уже решена, и можно сосредоточиться лишь на основной функции инструмента? Что если такие инструменты смогут работать в произвольном WebView, будь оно встроено в браузер, редактор или другое приложение на любом устройстве? Доклад про удалённые инструменты: какие есть сложности и как их обойти, как перестать бояться и начать делать инструменты под свои задачи и технологический стек.
Статья рассказывает о новом направлении в развитии статических анализаторов кода - верификации параллельных программ. В статье рассказывается о нескольких статических анализаторах, которые могут претендовать на звание "Parallel Lint".
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
При разработке 64-битной версии приложения дополнительное внимание стоит уделить и вопросу дистрибуции программы. Ведь при установке на 64-битной операционной системе есть несколько нюансов, забыв о которых можно получить неработающий инсталляционный пакет.
После компиляции программы в 64-битном режиме она начинает потреблять большее количество памяти, чем ее 32-битный вариант. Часто это увеличение почти незаметно, но иногда потребление памяти может возрастать в 2 раза.
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
Данная статья содержит различные примеры 64-битных ошибок, собранные в демонстрационном примере PortSample. Однако, начиная с версии PVS-Studio 3.63, вместо PortSample в дистрибутив PVS-Studio включается более новая версия примеров, которая называется OmniSample. Поэтому некоторые скриншоты в статье не соответствуют актуальному состоянию дел.
Мы закончили рассмотрение паттернов 64-битных ошибок. Последнее на чем мы остановимся в связи с этими ошибками, является то, как они могут проявляться в программах.
Сам по себе рост размера структур не является ошибкой, но может приводить к потреблению необоснованного количества памяти и в результате к замедлению скорости работы программы. Будем рассматривать данный паттерн не как ошибку, но как причину неэффективности 64-битного кода.
Процессоры работают эффективнее, когда имеют дело с правильно выровненными данными. А некоторые процессоры вообще не умеют работать с не выровненными данными.
Генерирование и обработка исключений с участием целочисленных типов не является хорошей практикой программирования на языке Си++. Для этих целей следует использовать более информативные типы, например классы, производные от класса std::exception.
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
Важным элементом переноса программного решения на новую платформу является преемственность к существующим протоколам обмена данными. Необходимо обеспечить чтение существующих форматов проектов, осуществлять обмен данными между 32-битными и 64-битными процессами и так далее.
Надеемся, вы уже успели отдохнуть от 13 урока и теперь сможете рассмотреть еще один важный паттерн ошибок, связанный с арифметическими выражениями, в которых участвуют типы различной размерности.
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarova
Особенностью объединения (union) является то, что для всех элементов (членов) объединения выделяется одна и та же область памяти, то есть они перекрываются. Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат был осмысленным.
Большое количество ошибок при миграции на 64-битные системы связано с изменением соотношения между размером указателя и размером обычных целых. В среде с моделью данных ILP32 обычные целые и указатели имеют одинаковый размер. К сожалению, 32-битный код повсеместно опирается на это предположение. Указатели часто приводятся к int, unsigned, long, DWORD и другим неподходящим типам.
Мы специально выбрали номер "тринадцать" для этого урока, поскольку ошибки, связанные с адресной арифметикой в 64-битных системах, являются наиболее коварными. Надеемся, число 13 заставит вас быть внимательнее.
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
Классическими примерами, приводимыми во многих статьях по проблемам переноса программ на 64-битные системы, является некорректное использование функций printf, scanf и их разновидностей.
В некачественном коде часто встречаются магические числовые константы, наличие которых опасно само по себе. При миграции кода на 64-битную платформу эти константы могут сделать код неработоспособным, если участвуют в операциях вычисления адреса, размера объектов или в битовых операциях.
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
Статический анализ кода - методология выявления ошибок в программном коде, основанная на просмотре программистом участков кода, помеченных статическим анализатором. Помеченные участки кода с большой вероятностью содержат ошибки определенного типа.
Хочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс.
Вначале следует убедиться, что используемая вами редакция Visual Studio позволяет собирать 64-битный код. Если вы планируете разрабатывать 64-битные приложения с использованием последней версии (на момент написания курса) Visual Studio 2008, то следующая таблица поможет определить, какая из редакций Visual Studio вам необходима.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
Инструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
PVS-Studio, решение для разработки современных ресурсоемких приложений
64-битная версия Loki
1. 64-битная версия Loki
Авторы: Евгений Рыжков, Андрей Карпов, Андрей Александреску, Питер Кюмель, Рич Спозато,
Дата: 25.09.2009
Аннотация
Статья представляет собой отчет о проверки библиотеки Loki на совместимость с 64-битными
системами с помощью анализатора кода Viva64 компании ООО "СиПроВер". Содержатся
рекомендации пользователям библиотеки. Статья будет полезна также пользователям других
библиотек, построенных на шаблонах, так как раскрывает особенности анализа подобных
библиотек.
Введение
Библиотека Loki разработана Андреем Александреску как часть книги "Современное
проектирование на С++: Обобщенное программирование и прикладные шаблоны
проектирования". Аннотация к книге гласит: "В книге изложена новая технология
программирования, представляющая собой сплав обобщенного программирования,
метапрограммирования шаблонов и объектно-ориентированного программирования на C++.
Настраиваемые компоненты, созданные автором, высоко подняли уровень абстракции, наделив
язык C++ чертами языка спецификации проектирования, сохранив всю его мощь и
выразительность".
Компания ООО "СиПроВер", создающая анализатор кода Viva64 для разработки 64-битных
приложений, активно общается с авторами различных программных проектов. Однажды к нам
обратился Рич Спозато (Rich Sposato), один из администраторов проекта Loki, и попросил
проверить код библиотеки на предмет совместимости с 64-битными системами с помощью
нашего инструмента Viva64. Мы сразу же согласились. Ведь это не только возможность принести
пользу сообществу разработчиков, но и настоящий "тест выносливости" для нашего анализатора
кода Viva64. Всем известно, что библиотека Loki написана с применением самых современных и
мощных возможностей языка Си++. И если анализатор Viva64 справится с Loki, то и другие более
простые проекты не вызовут никаких проблем.
Надо заметить, что данная статья основана на версии Loki от мая 2009 года (новее, чем
официальная на тот момент версия Loki 0.1.7), поэтому в более новых версиях Loki указанные
проблемы будут устранены.
Итак, мы скачали последнюю версию Loki из SVN-репозитория и приступили к работе.
Сборка 64-битной Loki в Microsoft Visual Studio 2005
Анализатор кода Viva64 интегрируется в среду разработки Microsoft Visual Studio, поэтому
разумно было собрать версию Loki именно для этой среды. В составе пакета Loki есть готовые
файлы решений для Visual Studio 2005 и Visual Studio 2008. Однако на момент мая 2009 года эти
решения содержат лишь 32-битные конфигурации. Поэтому необходимо в Visual Studio создать
2. конфигурации для платформы x64. Добавив нужные конфигурации можно запустить компиляцию
64-битной версии.
Библиотека Loki предназначена для работы на большом количестве различных платформ и
собирается с помощью многих наиболее известных компиляторов. Именно поэтому 64-битная
версия Loki скомпилировалась практически сразу же. Из 20 проектов, входящих в решение, не
собрался только один:
========== Build: 19 succeeded, 1 failed, 0 up-to-date, 0 skipped
==========
Это был проект SafeFormat:
16>------ Build started: Project: SafeFormat, Configuration: Debug x64
------
16>Compiling...
16>main.cpp
16>.main.cpp(255) : error C3066: there are multiple ways
that an object of this type can be called with these arguments
16> ....includeloki/SafeFormat.h(109): could be
'Loki::PrintfState<Device,Char>
&Loki::PrintfState<Device,Char>::operator ()(bool)'
...
16> while trying to match the argument list '(UInt)'
Текст ошибки несколько сокращен, поскольку полностью он займет целую страницу. Посмотрим
на код, который приводит к ошибке:
void test_dword()
{
typedef signed int Int;
typedef unsigned int UInt;
typedef signed long Long;
typedef unsigned long ULong;
Int i(0);
UInt ui(0);
Long l(0);
ULong ul(0);
Printf("%d")(i);
3. Printf("%d")(ui); // Проблема в этой строке
Printf("%d")(l);
Printf("%d")(ul);
}
Printf - это функция, внутри которой используется макрос LOKI_PRINTF_STATE_FORWARD. С
помощью этого макроса задается ряд вспомогательных функций. В нем-то и кроется проблема.
Внутри файла SafeFormat.h вместо следующего фрагмента:
#if (defined(_WIN32) || defined(_WIN64))
LOKI_PRINTF_STATE_FORWARD(unsigned long)
#else
необходимо написать так:
#if (defined(_WIN32) || defined(_WIN64))
#if (defined(_WIN64))
LOKI_PRINTF_STATE_FORWARD(unsigned int)
#endif
LOKI_PRINTF_STATE_FORWARD(unsigned long)
#else
После этого исправления ошибка компиляции пропадет и все 20 проектов библиотеки
скомпилируются.
Однако среди прочих диагностических сообщений (warnings) компилятора мы видим сообщение,
касающееся 64-битного кода:
2>.CachedFactoryTest.cpp(204) : warning C4267: 'argument' :
conversion from 'size_t' to 'const int', possible loss of data
2> .CachedFactoryTest.cpp(238) : see reference to function
template
instantiation 'milliSec typicalUse<Cache>
(Cache &,unsigned int,unsigned int,unsigned int)' being compiled
2> with
2> [
2> Cache=CRandomEvict
2> ]
4. 2> .CachedFactoryTest.cpp(252) : see reference to function
template
instantiation 'void displayTypicalUse<CRandomEvict>
(Cache &,unsigned int,unsigned int,unsigned int)' being compiled
2> with
2> [
2> Cache=CRandomEvict
2> ]
Это сообщение говорит о потенциально опасном преобразовании типа size_t внутри функции
typicalUse() в файле CachedFactoryTest.cpp:
// Registering objects
for(size_t i=0;i<objectKind;i++)
CC.Register(i, createProductNull);
Граница цикла (переменная objectKind) представлена типом unsigned. Поэтому использовать для
счетчика цикла переменную типа size_t не имеет смысла. После исправления типа счетчика цикла
проблема исчезнет:
// Registering objects
for(unsigned i=0;i<objectKind;i++)
CC.Register(i, createProductNull);
После этих небольших исправлений мы имеем 64-битную библиотеку, которая успешно
компилируется и не выдает никаких диагностических сообщений (warnings) насчет 64-битности.
Но насколько в действительности код библиотеки корректен? Это мы определим с помощью
нашего анализатора кода Viva64.
Проверка 64-битной Loki с помощью Viva64
Для того чтобы убедится в совместимости Loki с 64-битными системами, выполним анализ кода с
помощью Viva64. Анализатор кода Viva64 предназначен для разработки новых 64-битных
приложений и для миграций существующих 32-битных на 64-битную платформу.
Запуск Viva64 для анализа Loki выявил список из 89 потенциально-опасных синтаксических
конструкций. Это не значит, что в библиотеке Loki содержится 89 ошибок, связанных с 64-битным
кодом. Но все эти 89 мест должен просмотреть разработчик для того, чтобы понять,
действительно ли там возможна ошибка или нет. Разумеется, мы проанализировали эти ошибки.
1 Некорректно используемая константа LONG_MIN
Начнем с ошибки, связанной с некорректно используемой константой LONG_MIN в следующей
функции:
5. char* RenderWithoutSign(LOKI_SAFEFORMAT_SIGNED_LONG n,
char* bufLast, unsigned int base, bool uppercase)
Она находится в файле SafeFormat.h. Проблема в строке:
if (n != LONG_MIN) {
Тип LOKI_SAFEFORMAT_SIGNED_LONG объявляется как тип, способный вмещать 64-битные
значения в 64-битной системе. В Unix-системах (с моделью данных LP64) для этого используют тип
long. Но в 64-битных Windows-системах (модель данных LLP64) тип long остался 32-битным.
Поэтому в Loki тип LOKI_SAFEFORMAT_SIGNED_LONG объявлен так:
#if defined(_WIN32) || defined(_WIN64)
#define LOKI_SAFEFORMAT_SIGNED_LONG intptr_t
#define LOKI_SAFEFORMAT_UNSIGNED_LONG uintptr_t
#else
#define LOKI_SAFEFORMAT_SIGNED_LONG signed long
#define LOKI_SAFEFORMAT_UNSIGNED_LONG unsigned long
#endif
Поскольку тип long в 64-битных Windows-системах остался 32-битным, то и константа LONG_MIN
задает минимальное значение 32-битной переменной. А это значит, что ее использование
некорректно при работе с 64-битными типами (в нашем случае с intptr_t). Решением будет
использование собственной константы. Например, исправление может выглядеть так:
#if defined(_WIN32) || defined(_WIN64)
# define LOKI_SAFEFORMAT_SIGNED_LONG intptr_t
#if defined(_WIN64)
# define LOKI_SAFEFORMAT_SIGNED_LONG_MIN_VALUE LLONG_MIN
# define LOKI_SAFEFORMAT_SIGNED_LONG_MAX_VALUE LLONG_MAX
#else
# define LOKI_SAFEFORMAT_SIGNED_LONG_MIN_VALUE LONG_MIN
# define LOKI_SAFEFORMAT_SIGNED_LONG_MAX_VALUE LONG_MAX
#endif
...
#else
# define LOKI_SAFEFORMAT_SIGNED_LONG signed long
# define LOKI_SAFEFORMAT_SIGNED_LONG_MIN_VALUE LONG_MIN
6. # define LOKI_SAFEFORMAT_SIGNED_LONG_MAX_VALUE LONG_MAX
...
#endif
И, соответственно, строку
if (n != LONG_MIN) {
надо заменить на строку
if (n != LOKI_SAFEFORMAT_SIGNED_LONG_MIN_VALUE) {
К счастью и к похвале создателей библиотеки Loki это единственное место, которое заслуживавет
исправления. Описанные далее замечания могут быть интересны, но не имеют важности.
2 Некоторые виды магических чисел - ошибка или нет?
Одной из проблем, выявляемой анализатором Viva64 являются магические числа. С точки зрения
миграции кода с 32-битной на 64-битную платформу есть ряд чисел, использование которых
наиболее опасно. Возможно, где-то в коде программист рассчитывает на определенный размер
типа данных, что может вызвать проблему. Те, кто смотрят на сообщения от анализаторов кода,
часто жалуются на бессмысленность подобных сообщений. Действительно, какой смысл ругаться
анализатору кода на число 4 в подобных строках:
::Loki::ScopeGuard guard4 = ::Loki::MakeGuard( &HasFour, 1, 2, 3, 4 );
::Loki::ScopeGuard guard5 = ::Loki::MakeGuard( &HasFive, 1, 2, 3, 4, 5
);
Но бывают такие конструкции, которые надо анализировать очень тщательно. Например, в файле
SafeFormatmain.cpp видим код:
case 'X':
// TestCase(formatSpec, RandomInt(-10000, 10000));
// don't test negative values on 64bit systems, because
// snprintf does not support 64 Bit values
TestCase(formatSpec,
RandomInt( -10000 * (sizeof(size_t)>4 ? 0 : 1) , 10000));
break;
case 'e':
Конкретно в этом месте проблемы, конечно же, нет. Но диагностика магических чисел в
анализаторе кода нужна именно для нахождения таких конструкций в коде.
3 Прибавление int к указателю - потенциальная проблема
Файл flexsimplestringstorage.h содержит функцию:
void resize(size_type newSize, E fill)
7. {
const int delta = int(newSize - size());
if (delta == 0) return;
if (delta > 0)
{
if (newSize > capacity())
{
reserve(newSize);
}
E* e = &*end();
flex_string_details::pod_fill(e, e + delta, fill);
}
pData_->pEnd_ = pData_->buffer_ + newSize;
}
Анализатор Viva64 сообщает о потенциальной проблеме здесь:
flex_string_details::pod_fill(e, e + delta, fill);
Недостаток кода заключается в том, что к указателю e прибавляется переменная delta типа int. Это
потенциальная проблема, так как функция pod_fill не сможет обрабатывать объем данных более
двух гигабайт (INT_MAX символов). Конечно же, конкретно здесь ошибки, видимо, нет, поскольку
вряд ли бывают строки более двух гигабайт. Но лучше все-таки заменить тип переменной delta с
int на ptrdiff_t:
const ptrdiff_t delta = ptrdiff_t(newSize - size());
4 Использование int для индексации массивов некорректно
Для доступа к большим массивам данным (более INT_MAX элементов) надо использовать типы
ptrdiff_t или size_t. В файле SmallObjSmallObjBench.cpp присутсвует довольно большой макрос
LOKI_SMALLOBJ_BENCH_ARRAY, в котором работа с массивом ведется через индексацию по int.
Хотя это лучше исправить, в данном месте это не является ошибкой.
5 Правильные аргументы функций
Внутри файла CachedFactoryCachedFactoryTest.cpp объявлена функция:
template< class Cache >
milliSec typicalUse(Cache &CC, unsigned objectKind,
unsigned maxObjectCount, unsigned maxIteration)
8. Для параметра objectKind лучше использовать тип size_t. Но поскольку этот код относится к
тестам, то какой-либо серьезного недостатка в этом нет.
Библиотека Loki совместима с 64-битными системами - значит
программа, использующая ее также совместима?
Все немногие обнаруженные проблемы библиотеки Loki, перечисленные ранее, легко исправимы.
Значит ли это, что если в Loki нет никаких 64-битных проблем (а это именно так), то и приложение,
использующее эту библиотеку, безопасно с точки зрения 64-битного кода? К сожалению нет!
Все дело в том, что библиотека Loki крайне активно использует шаблоны. А когда анализатор кода
разбирает код шаблона, он не всегда может диагностировать проблему. Для полной уверенности
анализатору необходимо выполнить инстанцирование шаблонных классов и функций.
Приведем просто пример, не относящийся к библиотеке Loki. Анализатор Viva64 среди прочих
проблем в коде может обнаруживать неоптимальные структуры данных:
template <class T>
struct TClass
{
int m_a;
T m_b;
int m_c;
};
Если здесь T имеет тип int, то структура оптимальна. Если же T имеет тип size_t, то структура
займет 24 байта, вместо возможных 16 байтах. Тогда в случае большого количества подобных
объектов лучше было бы переписать:
template <class T>
struct TClass
{
T m_b;
int m_a;
int m_c;
};
Но проверить это анализатор может только выполнив инстанцирование шаблона. То есть имея
лишь объявление класса в заголовке выявит проблему нельзя.
Другой пример, опять же не относящийся к Loki, связанный с приведением типов:
template<typename T1, typename T2>
9. class TemplateClass
{
public:
void test1()
{
m_a.m_value = m_b.m_value; // Есть ли здесь ошибка?
}
private:
T1 m_a;
T2 m_b;
};
В данном коде ошибка приведения типов может быть, а может и не быть, в зависимости от того, с
какими параметрами будет выполнено инстанцирование шаблона TemplateClass. Только
анализируя код функции, не выполняя инстанцирование, анализатор не может сообщить об
ошибке.
Перечисленные два примера шаблонных классов не относятся к библиотеке Loki, однако важны
для понимания принципов работы анализаторов кода. Особенность шаблонных библиотек типа
Loki заключается в том, что даже если библиотека полностью совместима с 64-битными
системами, это не значит что код, который ее использует, корректен. Это в корне меняет подход к
верификации приложений. Если при работе с обычной (не шаблонной) библиотекой достаточно
быть уверенным, что библиотека корректна с точки зрения 64-бит для того, чтобы быть
уверенным в корректности всего приложения, то с шаблонными библиотеками такой уверенности
уже быть не может.
Все это означает, что хотя библиотека Loki и не содержит проблем 64-битного кода,
пользовательское приложение, которое ее использует должно быть дополнительно проверено
анализатором кода на отсутствие подобных проблем. Ведь ошибки зависят от того, с какими
параметрами выполняется инстанцирование шаблонов.
Выводы
По результатам работы сотрудников компании ООО "СиПроВер" над проверкой на совместимость
с 64-бибтными системами библиотеки Loki сделаны следующие выводы:
Библиотека полностью совместима с 64-битными системами и не содержит потенциальных
ошибок. Указанные в данной статье ошибки, скорее всего, будут очень быстро исправлены.
Анализатор кода Viva64, предназначенный для разработки новых 64-битных и миграции старых
32-битных приложений показал себя очень хорошо при проверке сложного шаблонного кода
библиотеки. Это говорит о высоком качестве анализатора кода.
10. Хотя библиотека Loki и не содержит 64-битных проблем, они возможны в пользовательских
приложениях, использующих Loki. Поскольку конечный код зависит от того, с какими
параметрами инстанцировались шаблоны, то обязательно надо проверять пользовательские
приложения анализатором кода. Только тогда можно быть уверенным в полной совместимости
приложения с 64-битными системами.
Благодарность
Благодарим всех, кто принимал участие в анализе библиотеки Loki и в оценке этой работы в
команде Loki:
• Спасибо компании ООО "СиПроВер", которая проанализировала код библиотеки Loki и
выполнила верификацию ее для работы в 64-битном режиме, в частности: Андрею
Карпову и Евгению Рыжкову.
• Спасибо команде Loki: Андрею Александреску, Питеру Кюмелю, Ричу Спозато за
совместную работу над проверкой и редактированием статьи, а также ценные замечания.
• Спасибо Ричу Спозато, за координирование всей работы.
Библиографический список
1. Библиотека Loki. http://www.viva64.com/go.php?url=515.
2. Анализатор кода Viva64. http://www.viva64.com/viva64-tool.