Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.
СОВМЕСТНОЕ ПРИМЕНЕНИЕ КОНТРАКТОВ И ВЕРИФИКАЦИИ ДЛЯ ПОВЫШЕНИЯ КАЧЕСТВА АВТОМАТ...ITMO University
При создании систем со сложным поведением важную роль играет контроль качества разрабатываемых программ. Цена ошибки в таких системах может быть слишком велика, поэтому важно не просто проверить соответствие создаваемой программы всем предъявленным к ней требованиям, но и сделать этот процесс эффективным, максимально автоматизировав его. На практике этого можно добиться, формализовав все требования к программе и храня полученную исполнимую спецификацию непосредственно вместе с кодом программы. Рассмотрены существующие методы контроля качества современных программных систем и автоматных программ, а также описан процесс создания среды, позволяющей поддержать сразу три подхода к проверке качества программ с явным выделением состояний: проверку на модели, модульное тестирование и контракты. Предложенный подход позволяет сохранить корректность записи сформулированных требований при изменении самой программы, а также интерактивно контролировать ее качество.
В статье описаны технологии тестирования, используемые при разработке статического анализатора кода PVS-Studio. Разработчики инструмента для программистов делятся принциами тестирования собственного программного продукта, которые могут быть интересны разработчикам аналогичных пакетов обработки текстовых данных или исходных кодов.
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...Tatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После переноса кода приложения высока вероятность его некорректной работы. В статье рассмотрены вопросы, связанные с верификацией и тестированием программного обеспечения. Обозначены сложности, с которыми может столкнуться разработчик 64-битных Windows приложений и пути их преодоления.
Регулярное использование статического анализа кода в командной разработкеTatyanazaxarova
Технологии статического анализа кода применяются в компаниях со зрелыми процессами разработки программного обеспечения. Однако уровень применения и внедрения в процесс разработки инструментов анализа кода может быть различным. Начиная от ручного запуска анализатора "время от времени" или при поиске трудноуловимых ошибок, и кончая ежедневным автоматическим запуском или запуском при добавлении нового исходного кода в систему контроля версий.
В статье рассмотрены различные уровни использования технологий статического анализа кода в командной разработке, показано как "перевести" процесс с одного уровня на другой. В качестве примера в статье используется разрабатываемый авторами анализатор кода PVS-Studio.
Реклама 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> или поискать обновленный вариант этой статьи.
Статья рассказывает о новом направлении в развитии статических анализаторов кода - верификации параллельных программ. В статье рассказывается о нескольких статических анализаторах, которые могут претендовать на звание "Parallel Lint".
СОВМЕСТНОЕ ПРИМЕНЕНИЕ КОНТРАКТОВ И ВЕРИФИКАЦИИ ДЛЯ ПОВЫШЕНИЯ КАЧЕСТВА АВТОМАТ...ITMO University
При создании систем со сложным поведением важную роль играет контроль качества разрабатываемых программ. Цена ошибки в таких системах может быть слишком велика, поэтому важно не просто проверить соответствие создаваемой программы всем предъявленным к ней требованиям, но и сделать этот процесс эффективным, максимально автоматизировав его. На практике этого можно добиться, формализовав все требования к программе и храня полученную исполнимую спецификацию непосредственно вместе с кодом программы. Рассмотрены существующие методы контроля качества современных программных систем и автоматных программ, а также описан процесс создания среды, позволяющей поддержать сразу три подхода к проверке качества программ с явным выделением состояний: проверку на модели, модульное тестирование и контракты. Предложенный подход позволяет сохранить корректность записи сформулированных требований при изменении самой программы, а также интерактивно контролировать ее качество.
В статье описаны технологии тестирования, используемые при разработке статического анализатора кода PVS-Studio. Разработчики инструмента для программистов делятся принциами тестирования собственного программного продукта, которые могут быть интересны разработчикам аналогичных пакетов обработки текстовых данных или исходных кодов.
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...Tatyanazaxarova
В результате появления на рынке персональных компьютеров 64-битных процессоров перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После переноса кода приложения высока вероятность его некорректной работы. В статье рассмотрены вопросы, связанные с верификацией и тестированием программного обеспечения. Обозначены сложности, с которыми может столкнуться разработчик 64-битных Windows приложений и пути их преодоления.
Регулярное использование статического анализа кода в командной разработкеTatyanazaxarova
Технологии статического анализа кода применяются в компаниях со зрелыми процессами разработки программного обеспечения. Однако уровень применения и внедрения в процесс разработки инструментов анализа кода может быть различным. Начиная от ручного запуска анализатора "время от времени" или при поиске трудноуловимых ошибок, и кончая ежедневным автоматическим запуском или запуском при добавлении нового исходного кода в систему контроля версий.
В статье рассмотрены различные уровни использования технологий статического анализа кода в командной разработке, показано как "перевести" процесс с одного уровня на другой. В качестве примера в статье используется разрабатываемый авторами анализатор кода PVS-Studio.
Реклама 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> или поискать обновленный вариант этой статьи.
Статья рассказывает о новом направлении в развитии статических анализаторов кода - верификации параллельных программ. В статье рассказывается о нескольких статических анализаторах, которые могут претендовать на звание "Parallel Lint".
В статье рассмотрен ряд вопросов связанных с тестированием 64-битного программного обеспечения. Обозначены сложности, с которыми может столкнуться разработчик ресурсоемких 64-битных приложений, и пути их преодоления.
Построение систем автоматического протоколирования Си/Си++ кодаTatyanazaxarova
Иногда единственным методом отладки является использование протоколирования событий приложения. К недостаткам протоколирования (логирования) можно отнести большой объем кода, который приходится писать вручную для сохранения всей необходимой информации. В статье рассматривается методика, позволяющая построить систему автоматического протоколирования кода на языке Си/Си++.
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
Статический анализ кода - методология выявления ошибок в программном коде, основанная на просмотре программистом участков кода, помеченных статическим анализатором. Помеченные участки кода с большой вероятностью содержат ошибки определенного типа.
Применение статического анализа кода в преподавании и в разработке свободного ПОAndrey Karpov
В своём докладе я расскажу, как использование татического анализа может помочь преподавателям и студентам обучать и обучаться. Также я расскажу, как именно стоит наладить процесс анализа для использования в студенческих роектах разработки СПО, чтобы удовлетворить специфике работы в рамках учебного заведения.
Непрерывный анализ качества кода с помощью SonarQubeVasilii Chernov
Непрерывный анализ качества кода с помощью SonarQube. В презентации освещены основные принципы статического анализа кода, использование SonarQube, плагина для Jenkins CI SonarQube Github plugin и использование SonarLint для pre-commit проверки
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Tatyanazaxarova
Интервью с Дмитрием Вьюковым - автором инструмента Relacy Race Detector (RRD) для верификации параллельных приложений. В статье вы узнаете об истории создания RRD, его основных возможностях, а также о некоторых других аналогичных инструментах и их отличии от RRD.
Поиск уязвимостей в программах с помощью анализаторов кодаTatyanazaxarova
В настоящее время разработано большое количество инструментальных средств, предназначенных для автоматизации поиска уязвимостей программ. В данной статье будут рассмотрены некоторые из них.
Отладка и оптимизация многопоточных OpenMP-программTatyanazaxarova
Задача знакомства программистов с областью разработки параллельных приложений становится все актуальней. Данная статья является кратким введением в создание многопоточных приложений, основанных на технологии OpenMP. Описаны подходы к отладке и оптимизации параллельных приложений.
В статье рассмотрен ряд вопросов связанных с тестированием 64-битного программного обеспечения. Обозначены сложности, с которыми может столкнуться разработчик ресурсоемких 64-битных приложений, и пути их преодоления.
Построение систем автоматического протоколирования Си/Си++ кодаTatyanazaxarova
Иногда единственным методом отладки является использование протоколирования событий приложения. К недостаткам протоколирования (логирования) можно отнести большой объем кода, который приходится писать вручную для сохранения всей необходимой информации. В статье рассматривается методика, позволяющая построить систему автоматического протоколирования кода на языке Си/Си++.
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
Статический анализ кода - методология выявления ошибок в программном коде, основанная на просмотре программистом участков кода, помеченных статическим анализатором. Помеченные участки кода с большой вероятностью содержат ошибки определенного типа.
Применение статического анализа кода в преподавании и в разработке свободного ПОAndrey Karpov
В своём докладе я расскажу, как использование татического анализа может помочь преподавателям и студентам обучать и обучаться. Также я расскажу, как именно стоит наладить процесс анализа для использования в студенческих роектах разработки СПО, чтобы удовлетворить специфике работы в рамках учебного заведения.
Непрерывный анализ качества кода с помощью SonarQubeVasilii Chernov
Непрерывный анализ качества кода с помощью SonarQube. В презентации освещены основные принципы статического анализа кода, использование SonarQube, плагина для Jenkins CI SonarQube Github plugin и использование SonarLint для pre-commit проверки
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Tatyanazaxarova
Интервью с Дмитрием Вьюковым - автором инструмента Relacy Race Detector (RRD) для верификации параллельных приложений. В статье вы узнаете об истории создания RRD, его основных возможностях, а также о некоторых других аналогичных инструментах и их отличии от RRD.
Поиск уязвимостей в программах с помощью анализаторов кодаTatyanazaxarova
В настоящее время разработано большое количество инструментальных средств, предназначенных для автоматизации поиска уязвимостей программ. В данной статье будут рассмотрены некоторые из них.
Отладка и оптимизация многопоточных OpenMP-программTatyanazaxarova
Задача знакомства программистов с областью разработки параллельных приложений становится все актуальней. Данная статья является кратким введением в создание многопоточных приложений, основанных на технологии OpenMP. Описаны подходы к отладке и оптимизации параллельных приложений.
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...Tatyanazaxarova
В статье приводятся результаты исследований ошибок, которые допускают программисты, использующие С++ и OpenMP. Для автоматического обнаружения этих ошибок предлагается использование статического анализа. Описывается интегрирующийся в среду Visual Studio анализатор VivaMP, реализующий поставленную задачу.
Трудности сравнения анализаторов кода или не забывайте об удобстве использованияTatyanazaxarova
Желание пользователей сравнить между собой разные анализаторы кода понятно и естественно. Однако реализовать это желание совсем не так просто как может показаться на первый взгляд. Дело в том, что непонятно какие конкретно факторы между собой сравнивать.
Инструмент для программистов VivaMP предназначен для помощи разработчикам параллельных программ на базе OpenMP. В статье приведен краткий обзор программного продукта.
В работе приведен обзор 7 классов метрик и более 50 их представителей, дано детальное описание и используемые алгоритмы вычисления, описана роль метрик в разработке программного обеспечения.
Константин Книжник: статический анализ, взгляд со стороныTatyanazaxarova
Статья представляет интервью, взятое у Константина Книжника, сотрудником компании "Системы программной верификации" Андреем Карповым. Затронуты вопросы статического анализа кода, актуальность решений в этой области, а также перспективы использования статического анализа при разработке параллельных приложений.
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММITMO University
Описан подход к автоматизации тестирования автоматных программ. Для формализации требований спецификации к модели и объектам управления предлагается использовать контракты. Тест описывается как последовательность переходов в модели. Для автоматизации процесса создания кода теста предложен генетический алгоритм, который позволяет находить значения переменных, удовлетворяющие условиям на переходах.
Урок 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-битную платформу эти константы могут сделать код неработоспособным, если участвуют в операциях вычисления адреса, размера объектов или в битовых операциях.
Исправление всех ошибок компиляции и предупреждений не будет означать работоспособность 64-битного приложения. И именно описанию и диагностике 64-битных ошибок будет посвящена основная часть уроков. Также не надейтесь на помощь ключа /Wp64, который многими часто без оснований преподносится при обсуждениях в форумах как чудесное средство поиска 64-битных ошибок.
Хочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс.
Вначале следует убедиться, что используемая вами редакция Visual Studio позволяет собирать 64-битный код. Если вы планируете разрабатывать 64-битные приложения с использованием последней версии (на момент написания курса) Visual Studio 2008, то следующая таблица поможет определить, какая из редакций Visual Studio вам необходима.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
Инструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
Мы все допускаем ошибки при программировании и тратим массу времени на их устранение.
Один из методов который позволяет быстро диагностировать дефекты – статический анализ исходного кода.
1. Тестирование параллельных
программ
Автор: Андрей Карпов
Дата: 02.11.2008
Аннотация
Тестирование параллельного программного обеспечения представляет собой более сложную
задачу по сравнению с тестированием последовательной программы. Программист должен знать
о подводных камнях при тестировании параллельного кода, имеющихся методологиях и
инструментарии.
Введение
Говоря о разработке программного обеспечения, выделяют этап тестирования и отладки
приложения. Понятия тестирование и отладка слабо разделяют между собой. Это связано с тем,
что после нахождения ошибки при тестировании ее устранение часто связано с отладкой
программы. А отладку приложения в свою очередь можно называть тестированием методом
белого ящика. Иногда под этапом отладки понимают одновременно и поиск и устранение
ошибок.
Мы все-таки разделим эти два понятия, и сосредоточимся в этой статье на тестировании
параллельного программного обеспечения.
Тестирование программного обеспечения - процесс выявления ошибок в программном
обеспечении с использованием различных инструментов и анализ работоспособности программы
конечными пользователями [1].
Отладка - процесс обнаружения программистом в коде ошибок, вывяленных в ходе тестирования
программного обеспечения с целью их дальнейшего устранения. Отладка обычно подразумевает
использование специализированных инструментов для отслеживания состояния программы в
ходе ее исполнения.
Отладка параллельных программ - дело неблагодарное, требующее аккуратности и
специализированных инструментов. Отладке параллельных программ посвящено много статей и
следует посветить еще больше, поскольку данная тематика весьма актуальна в связи с активным
развитием многоядерных систем и новых технологий создания параллельных программ. В
области инструментария также существуют пробелы. Но прежде чем заняться отладкой - ошибку
нужно найти. При этом некоторые методы отладки не только обнаруживают ошибку, но и сразу
локализуют место ее нахождения. Поэтому займемся тестированием.
1. Сложности тестирования параллельных программ
Тестирование приложений с параллельной обработкой - задача непростая. Ошибки
распараллеливания сложно выявить из-за недетерминированности поведения параллельных
2. приложений. Даже если ошибка обнаружена, ее часто сложно воспроизвести повторно. Кроме
того, после модификации кода, не так просто убедиться, что ошибка действительно устранена, а
не замаскирована. Все это можно назвать и по другому, а именно, что ошибки в параллельной
программе являются классическими "гейзенбагами".
Гейзенбаг (англ. Heisenbug) - термин, используемый в программировании для описания
программной ошибки, которая исчезает или меняет свои свойства при попытке её обнаружения
[2]. Данное название является игрой слов и происходит от физического термина "Принцип
неопределённости Гейзенберга", который на бытовом уровне понимается как изменение
наблюдаемого объекта в результате самого факта наблюдения, происходящее в квантовой
механике. В русской терминологии более часто используется термин "плавающая ошибка".
Примером могут являться ошибки, которые проявляются в окончательном варианте программы
("релизе"), однако не видны в режиме отладки, или ошибки синхронизации в многопоточном
приложении.
Таким образом, задача параллельного тестирования во многом сводится к проблеме создания
инструментов диагностики, минимально влияющих на поведение программы или создающих
необходимые условия для ее проявления. Поэтому посмотрим на классические методологии
тестирования под новым углом.
2. Методики поиска ошибок в параллельных программах
Методики поиски ошибок в параллельных приложениях, как и в последовательных можно
разделить на динамический анализ, статический анализ, проверку на основе моделей и
доказательство корректности программы [3].
Формальное доказательство корректности программы является крайне сложной процедурой,
особенно когда речь заходит о параллельном программировании и практически не применяется
промышленной разработки программного обеспечения.
Динамический анализ подразумевает под собой необходимость запуска приложения и
выполнения различный последовательностей действий, целью которых ставится выявление
некоренного поведения программы. Последовательность действий может задаваться как
человеком при ручном тестировании, так и с использованием различных инструментов
реализующих нагрузочное тестирование или, например, проверку целостности данных. В случае
параллельных программ наибольший интерес представляют инструменты подобные Intel Thread
Checker, которые оснащают исходный код приложения средствами мониторинга и
протоколирования, которые позволяют выявлять взаимоблокировки (как явные, так и
потенциальные), зависания, гонки и так далее [4].
Статический анализ работает только с программным кодом приложения, не требуя его запуска. В
качестве преимущества можно отметить детальность и полноту охвата анализируемого кода.
Следует отметить, что в сфере параллельного программирования методология статического
анализа используется достаточно редко и представлены малым количеством инструментов,
которые являются скорее исследовательскими, чем коммерческими продуктами.
Проверка на основе модулей представляет собой автоматическую генерацию тестов по заданным
правилам. Проверка на основе моделей позволяет формально обосновать отсутствие дефектов в
тестируемой части кода, на основе заданной разработчиком правил преобразования данных. В
3. качестве примера можно назвать инструмент KISS, разработанный в Microsoft Research для
параллельных программ на C.
Все перечисленные методики имеют свои недостатки, что не позволяет положиться при
разработке параллельных программ только на одну из них.
Динамический анализ требует запуска программ, чувствителен к среде исполнения, существенно
замедляет скорость выполнения приложения. Достаточно трудно осуществить покрытие тестами
всего параллельного кода. Часто зафиксировать состояние гонки (race conditions) удается, только
если оно было в данном сеансе работы программы. То есть, если средство динамического
анализа сообщает, что ошибок нет, вы все равно не можете быть уверены в этом.
В случае параллельных приложений статический анализ крайне сложен и часто невозможно
предсказать поведение программы, так как неизвестен допустимый набор входных значений для
различных функций и способ их вызова. Эти значения можно прогнозировать на основе
остального кода, но крайне ограниченно, так как возникает огромное пространство возможных
состояний и объем проверяемой информации (вариантов) увеличивается до недопустимых
значений. Также средства статического анализа часто дают большое количество ложных
сообщений о потенциальных ошибках и требуют немалых усилий для их минимизации.
На практике проверка на основе моделей действенна лишь для небольших базовых блоков
приложения. В большинстве случаев очень сложно автоматически построить модель на основе
кода, а создание моделей вручную - крайне трудоемкое и ресурсоемкое занятие. Фактически
необходимо написать те же алгоритмы преобразования данных, но в ином представлении. Как и в
случае статического анализа возникает проблема быстрого расширении пространства состояний.
Расширение пространства состояний можно в частично контролировать, применяя методы
редукции со сложной эвристической логикой, но это приводит к тому, что некоторые дефекты
будут пропущены. В качестве примера инструмента проверки для тестирования проектов
параллельных приложений на основе моделей можно назвать Zing.
Как видно, использование какого-то одного подхода к тестированию параллельных приложений
неэффективно и хорошим решением является использовать несколько методик для тестирования
одного и погоже программного продукта.
3. Новые технологии - новые инструменты
Поскольку при решении задачи увеличения производительности выбор был сделан в пользу
многоядерных процессоров, то это повлекло и новый виток в развитии инструментальных средств
разработки. Для многоядерных систем с общей памятью более удобным оказывается
использование таких технологий программирования, как OpenMP, вместо более привычных MPI
или стандартных средств распараллеливания, предоставляемых операционными системами (fork,
beginthread).
Для новых технологий нужны и новые инструменты их поддержки. Сейчас следует активно
следить за новыми системами поддержки параллельного программирования, появляющимися на
рынке программного обеспечения. Они могут существенно облегчить ваш труд и быстрее
адаптировать ваши приложения для эффективного использования параллельной среды. Одним из
таких инструментов является разработанный в компании "Системы программной верификации"
статический анализатор кода VivaMP.
4. Как уже было сказано, статический анализ параллельных программ сложен и малоэффективен,
так как необходимо хранить крайне много информации о возможных состояниях программы. Это
совершенно справедливо при использовании таких технологий параллельного программирования
как MPI или распараллеливания средствами операционной системы.
С технологией OpenMP ситуация обстоит лучше и часто можно реализовать эффективный
статический анализ, обладающий хорошими показателями. Это связано с тем, что технология
OpenMP ориентирована на распараллеливание изолированных участков кода. OpenMP как бы
позволяет делать программу параллельной "по кусочкам", с помощью расстановки специальных
директив в наиболее критичным по быстродействию частям кода. В результате параллельный код
оказывается сгруппирован и не зависит от других частей приложения, что позволяет провести его
качественный анализ.
До недавнего времени направление статического анализа OpenMP программ практически было
не освоено. В качестве примера можно привести, пожалуй, только достаточно качественную
диагностику выполняемую компилятором Sun Studio. Статический анализатор VivaMP заполнил
это нишу. Это специализированный инструмент для поиска ошибок в параллельных программах,
разработанных с использованием технологии OpenMP на языке Си и Си++ [5].
Данный анализатор как обнаруживает явные ошибки, так и предупреждает о потенциально
опасном коде. В качестве диагностики ошибок можно привести пример обнаружения
использование одной переменной для записи из параллельных потоков без необходимой
синхронизации:
int sum1 = 0;
int sum2 = 0;
#pragma omp parallel for
for (size_t i = 0; i != n; ++i)
{
sum1 += array[i]; // V1205
#pragma atomic
sum2 += array[i]; //Fine
}
А в качестве примера диагностики потенциально опасно опасного кода можно привести пример
использования flush для указателя. Несложно ошибиться, забыв, что операция flush будет
применена именно к указателю, а не к данным, на которые он ссылается. В результате
приведенный код может быть как корректным, так и некорректным:
int *ptr;
...
#pragma omp flush(ptr) // V1202
int value = *ptr;
5. В следующей версии анализатора VivaMP также будут реализованы некоторые проверки
связанные с выявлением неэффективного параллельного кода. Например, будут критические
секции там, где было бы достаточно использовать более быструю директиву atomic:
#pragma omp critical
{
a++; //Slow
}
#pragma omp atomic
a++; //Good
Заключение
Различные формы распараллеливания существуют в мире программного обеспечения уже давно.
Однако для создания массовых коммерческих приложений, использующих возможности
многоядерных процессоров в полной мере, требуются иные методы разработки, отличные от
применяемых при создании последовательных приложений. Хочется надеяться, что данная статья
прольет свет на те сложности, с которыми связана разработка параллельных приложений, и
программист со всей серьезностью отнесется к выбору наиболее подходящих средств разработки
и тестирования таких программ.
Библиографический список
1. Wikipedia. Тестирование программного обеспечения.
http://www.viva64.com/go.php?url=156
2. Wikipedia. Гейзенбаг. http://www.viva64.com/go.php?url=157
3. Рахул В. Патил и Бобби Джордж. Инструменты и методики для выявления проблем,
связанных с параллельным выполнением кода. http://www.viva64.com/go.php?url=158
4. Евгений Романовский. Отладка многопоточных OpenMP-программ.
http://www.viva64.com/go.php?url=155
5. Андрей Карпов, Евгений Рыжков. Применение технологии статического анализа кода при
разработке параллельных программ. http://www.viva64.com/art-3-1-441110260.html