Введение к работе
Актуальность работы
Надёжность и эффективность функционирования многих сложных систем народно-хозяйственного и оборонного назначения в значительной степени определяется надёжностью ПО. А на надёжность ПО таких систем, работающих в режиме реального времени, заметное влияние оказывают ошибки работы с памятью (ОРП) - программные ошибки при динамическом выделении и освобождении оперативной памяти. Более того, в ряде случаев такие ошибки могут приводить к катастрофическим последствиям. Поэтому своевременное выявление и устранение ОРП крайне важно. Стремительный рост сложности и объёма ПО, связанный с возрастанием сложности и ростом номенклатуры функций, выполняемых такими системами, приводит к необходимости постоянного совершенствования инструментария для выявления и устранения ОРП в ПО реального времени.
В настоящее время динамические системы решают сложные и ответственные задачи, поэтому очень важно, чтобы программное обеспечение таких систем содержало минимум ошибок.
В процессе программирования возникают ситуации, когда заранее не известно, сколько объектов – чисел, строк текста и прочих данных будет хранить программа. В таком случае при разработке программного обеспечения (ПО) используется динамическое выделение памяти. Многие современные системы характеризуются большим объемом данных, что также требует динамического выделения памяти.
ПО современных систем реального времени (СРВ) написано преимущественно на языках программирования С и С++. Данные языки программирования позволяют разработчику динамически распределять и освобождать память. Удобство динамического распределения памяти в C и C++ состоит в том, что язык программирования предоставляет доступ к памяти, позволяет изменять размер выделенной программе памяти, перемещать, копировать и освобождать ее во время исполнения приложения. Однако в результате написания исходного кода программ у программистов-разработчиков часто возникают ошибки работы с памятью, которые могут приводить к потере информации, некорректному поведению системы, системным сбоям и отказам, что критично для систем реального времени.
Программная ошибка при работе с памятью - это ошибка, которую совершает разработчик на стадии кодирования ПО, связанная с некорректным динамическим выделением или освобождением сегментов оперативной памяти (ресурса).
Критичными для систем реального времени являются ошибки, пагубно сказывающиеся на времени реакции системы на внешние воздействия или на работоспособность системы в целом.
В настоящее время можно выделить 2 основных направления поиска ошибок в программном обеспечении: на статическом и на динамическом этапе отладки ПО.
На динамическом этапе отладке известны методы: анализ трасс выполнения, мониторинг, различные виды тестирования. В основе динамического этапа отладки программного обеспечения лежит применение средств анализа непосредственно во время работы исследуемой программы (например, средство анализа Valgrind). Применение таких средств может быть эффективным для обнаружения ошибок в процессе выполнения. Однако, помимо существенного снижения производительности тестируемой программы, данные средства проверяют корректность выполнения программы лишь на конечном множестве детерминированных наборов входных данных (тестов) и не могут гарантировать корректность работы исследуемой программы в процессе дальнейшей эксплуатации при произвольных наборах.
На статическом этапе отладке известны методы: дедуктивная верификации, верификация на основе проверки моделей, статический анализ. Статический этап отладки основан на анализе программного обеспечения, производимом без реального выполнения исследуемых программ. Анализ производится над исходным кодом проекта. Наиболее перспективным методом выявление программных ошибок при работе с памятью представляется статический анализ. Статический анализ позволяет охватывать весь исходный код проверяемых проектов, а процедура проверки не может повредить или изменить сам исходный код. К существующим алгоритмам статического анализа относятся: анализ потока управления, абстрактная интерпретация, анализ значений, включающий в себя интервальный анализ и анализ указателей; анализ зависимостей программы.
На статическом этапе отладки в настоящее время не существует эффективных автоматизированных средств, специализирующихся на поиске ошибок при работе с памятью на языках C и C++, пригодных для применения в рассматриваемой предметной области. Основной задачей современных средств статического анализа (например, Coverity, Cppcheck) является поиск логических и стилистических ошибок в исходном коде программного обеспечения, а также выдача советов по оптимизации анализируемой программы. Указанные средства не позволяют охватить весь спектр программных ошибок при работе с памятью, возникает большое количество ложных срабатываний, кроме того эти средства тратят излишнее время для поиска указанных ошибок.
Исходя из сказанного, создание методик и программно-инструментальных средств автоматизированного выявления программных ошибок при работе с оперативной памятью в сложных динамических системах, реализованных на языках программирования C и C++, является актуальной задачей.
Цель работы
Целью диссертационной работы является разработка и исследование методики обнаружения и локализации основных программных ошибок при работе с памятью на статическом этапе отладке программного обеспечения.
Объект и предмет исследования
Объектом исследования является программное обеспечение сложных динамических систем, включая системы реального времени.
Предметом исследования является процесс отладки программного обеспечения.
Научная задача исследования
Научную задачу исследования составляет разработка методики выявления программных ошибок при работе с памятью, позволяющей автоматизировано находить наиболее опасные для систем реального времени ошибки.
Декомпозиция научной задачи позволяет выделить следующие частные задачи исследования.
1) Критический анализ области, существующих подходов и инструментов обнаружения программных ошибок.
2) Классификация программных ошибок при работе с памятью в ПО.
3) Создание методики автоматизированного обнаружения программных ошибок при работе с памятью на основе анализа исходного кода ПО.
4) Создание на основе предложенной методики программного средства, позволяющего проводить анализ ПО на статическом этапе отладки за существенно меньшее время, чем существующие средства.
5) Сопоставительный анализ предложенного инструментария с известными.
Научная новизна
Научная новизна работы состоит в следующем:
-
Разработана методика обнаружения и локализации основных программных ошибок при работе с памятью, использующая оригинальный метод анализа исходного кода и выявления наиболее опасных ОРП на статическом этапе отладки программного обеспечения.
-
Предложен метод анализа исходного кода ПО, реализованного на языках программирования C/C++, для выявления ОРП. Метод отличается тем, что вводится механизм контроля состояний сегментов памяти после построения промежуточного представления данных в режиме статической отладки. Метод позволяет выявлять наиболее опасные ошибки работы с памятью в исходном коде ПО на статическом этапе отладки за короткий промежуток времени.
-
Разработана модель состояний объектов памяти и основанные на этой модели правила выявления ОРП, в совокупности направленные на минимизацию затрат времени.
-
Предложена классификация ошибок, ориентированная на программные ошибки при работе с памятью, являющиеся критичными для систем реального времени.
-
Предложена структура программного средства отладки ПО, позволяющая обнаруживать ошибки работы с памятью в программном обеспечении на статическом этапе отладки за короткий промежуток времени.
-
Предложена система из четырёх показателей качества и методика сравнения по этим показателям программно-инструментальных средств выявления ошибок работы с памятью на статическом этапе отладки, использующая результаты работы этих средств на проектах ПО разного объёма и сложности.
Достоверность результатов
Достоверность представленных в настоящей работе положений и выводов подтверждена полученными результатами экспериментальных исследований разработанного прототипа программного средства MEDIS для отладки ПО.
Практическая значимость
Разработанная методика предназначена для автоматизации обнаружения программных ошибок при работе с памятью в программном обеспечении. Применение данной методики позволяет повысить качество как вновь разрабатываемых, так и уже созданных программных систем, а также снизить объем трудозатрат при отладке путем переноса основной нагрузки на статический этап. Предложенная методика может быть использована для выявления ОРП и в других приложениях, которые критичны к ошибкам такого рода.
Реализованный в рамках данной работы прототип средства обнаружения и локализации ошибок позволяет автоматизировано находить наиболее опасные ОРП за короткий промежуток времени.
Теоретические и практические результаты диссертационной работы могут являться основой для разработки промышленного средства выявления программных ошибок.
Реализация результатов работы
Реализацией результатов работы является прототип программного средства отладки MEDIS, в котором использован разработанный в диссертации метод. В работе продемонстрированы функциональные возможности созданного прототипа, а также его эффективность на реальных проектах ПО СРВ.
Результаты диссертационной работы используются в текущих разработках ПО, что подтверждается соответствующим актом.
Апробация работы
Основные научные положения и результаты работы докладывались на научно-технических конференциях: «Взгляд в будущее 2011», «Состояние, проблемы и перспективы создания корабельных информационно-управляющих комплексов 2011», «Корабельные системы управления и обработки информации. Проектирование и изготовление 2011», «Корабельные системы управления и обработки информации. Проектирование и изготовление 2011», «Взгляд в будущее 2012», «Состояние, проблемы и перспективы создания корабельных информационно-управляющих комплексов 2012», «Корабельные системы управления и обработки информации. Проектирование и изготовление 2012», «Состояние, проблемы и перспективы создания корабельных информационно-управляющих комплексов 2013».
Публикации
По результатам диссертационной работы опубликовано 12 статей, в том числе 3 в изданиях, рекомендованных ВАК.
Получено авторское Свидетельство о Государственной регистрации программы для ЭВМ №2013616813.
Структура и объем работы
Диссертационная работа состоит из введения, трех разделов, заключения, списка использованных источников. Общий объем работы составляет 136 печатных страниц. Работа содержит 23 рисунка, 20 таблиц, список источников из 107 наименований, 2 приложения.
На защиту выносятся
-
Методика обнаружения и локализации основных программных ошибок при работе с памятью на статическом этапе отладке программного обеспечения, позволяющая повысить качество ПО и снизить трудозатраты на динамическом этапе отладки путем переноса основной нагрузки на статический этап.
-
Новый метод автоматизированного выявления программных ошибок при работе с памятью, позволяющий существенно снизить временные затраты при анализе ПО. Метод имеет малую чувствительность к потоку данных (кроме переменных, являющихся указателями на выделенную память), не учитывает межпоточное взаимодействие, не обрабатывает рекурсивные вызовы.
-
Модель состояний объектов памяти и правила выявления ошибок работы с памятью.
-
Классификация ошибок при работе с памятью, позволяющая систематизировать исследуемую предметную область в соответствии с особенностями ПО.
-
Структура программного средства автоматизированного обнаружения и локализации ошибок, связанных с некорректной работой с памятью в ПО, эффективность которого продемонстрирована как на ряде специально подобранных модельных примеров, так и на реальных проектах.
-
Система из четырёх показателей качества и методика сравнения по этим показателям программно-инструментальных средств выявления ошибок работы с памятью на статическом этапе отладки.