Метод обнаружения ошибок при работе с памятью на статическом этапе отладки программного обеспечения тема диссертации и автореферата по ВАК РФ 05.13.11, кандидат наук Тетерев, Михаил Александрович

  • Тетерев, Михаил Александрович
  • кандидат науккандидат наук
  • 2013, Москва
  • Специальность ВАК РФ05.13.11
  • Количество страниц 136
Тетерев, Михаил Александрович. Метод обнаружения ошибок при работе с памятью на статическом этапе отладки программного обеспечения: дис. кандидат наук: 05.13.11 - Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей. Москва. 2013. 136 с.

Оглавление диссертации кандидат наук Тетерев, Михаил Александрович

СОДЕРЖАНИЕ

СОДЕРЖАНИЕ

Перечень сокращений

ВВЕДЕНИЕ

1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ

1.1 Источники и причины возникновения ошибок при работе с оперативной памятью и их классификация

1.1.1 Проблематика ошибок в современном программном обеспечении

1.1.2 Функции динамического распределения памяти

1.1.3 Классификация программных ошибок

1.2 Существующие способы предотвращения ошибок при работе с памятью

1.3 Анализ метода выявления программных ошибок Cppcheck

1.4 Постановка задачи исследования

1.5 Выводы по разделу

2 МЕТОДИКА ОБНАРУЖЕНИЯ ПРОГРАММНЫХ ОШИБОК ПРИ РАБОТЕ С ПАМЯТЬЮ

2.1 Общая характеристика методики

2.1.1 Используемый понятийный аппарат

2.1.2 Классификация программных ошибок при работе с памятью

2.1.3 Методика применения статического анализа кода

2.1.4 Математическая модель состояний объектов памяти

2.2 Промежуточное представления данных

2.2.1 Препроцессорная обработка

2.2.2 Распознавание определений функций

2.2.3 Построение графа вызовов

2.3 Контроль состояний памяти

2.3.1 Внутрипроцедурный анализ

2.3.2 Межпроцедурный анализ

2.3.3 Выявление ошибок

2.4 Генерация сообщений о выявленных ошибках

2.5 Оценка сложности алгоритма

2.6 Выводы по разделу

3 ПРАКТИЧЕСКИЕ АСПЕКТЫ РЕАЛИЗАЦИИ РЕЗУЛЬТАТОВ ИССЛЕДОВАНИЯ

3.1 Специальное программно-инструментальное средство MEDIS для отладки программного обеспечения

3.1.1 Назначение и основные требования

3.1.2 Структура программного средства MEDIS

3.1.3 Особенности реализации

3.2 Результаты испытаний программного средства MEDIS

3.3 Оценка эффективности результатов исследования

3.4 Выводы по разделу

ЗАКЛЮЧЕНИЕ

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

ПРИЛОЖЕНИЕ А

ПРИЛОЖЕНИЕ Б

Перечень сокращений

мсвс - мобильная система вооруженных сил;

нжмд - накопитель на жестком магнитном диске;

ОРП - ошибки работы с памятью;

ОС - операционная система;

ОСРВ - операционная система реального времени;

пис - программно-инструментальное средство;

по - программное обеспечение;

ПЭВМ - персональная электронно-вычислительная машина;

СВОРП - статическое выявление ошибок работы с памятью;

СРВ - система реального времени;

ЭВМ - электронно-вычислительная машина;

ANSI - American national standards institute;

CPU - central processing unit;

IR - intermediate representation;

MEDIS - memory-related errors detection and isolation system;

POSIX - portable operating system interface;

RAM - random access memory;

SGI - silicon graphics computer systems, inc.;

SSA - static single assignment;

STL - standard template library.

Рекомендованный список диссертаций по специальности «Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей», 05.13.11 шифр ВАК

Введение диссертации (часть автореферата) на тему «Метод обнаружения ошибок при работе с памятью на статическом этапе отладки программного обеспечения»

ВВЕДЕНИЕ

Актуальность работы

Надёжность и эффективность функционирования многих сложных систем народно-хозяйственного и оборонного назначения в значительной степени определяется надёжностью программного обеспечения (ПО). А на надёжность ПО таких систем, работающих в режиме реального времени, заметное влияние оказывают ошибки работы с памятью (ОРП) - программные ошибки при динамическом выделении и освобождении оперативной памяти. Более того, в ряде случаев такие ошибки могут приводить к катастрофическим последствиям. Поэтому своевременное выявление и устранение ОРП крайне важно. Стремительный рост сложности и объёма ПО, связанный с возрастанием сложности и ростом номенклатуры функций, выполняемых такими системами, приводит к необходимости постоянного совершенствования инструментария для выявления и устранения ОРП в ПО реального времени.

В настоящее время динамические системы решают сложные и ответственные задачи, поэтому очень важно, чтобы программное обеспечение таких систем содержало минимум ошибок.

В процессе программирования возникают ситуации, когда заранее не известно, сколько объектов - чисел, строк текста и прочих данных будет хранить программа. В таком случае при разработке программного обеспечения используется динамическое выделение памяти [105]. Многие современные системы характеризуются большим объемом данных, что также требует динамического выделения памяти.

ПО современных систем реального времени написано преимущественно на языках программирования С и С++ [60, 80]. Данные языки программирования позволяют разработчику динамически распределять и освобождать память. Удобство динамического распределения памяти в С и С++ состоит в том, что язык программирования предоставляет доступ к памяти, позволяет изменять размер выделенной программе памяти, перемещать, копировать и освобождать ее во время исполнения приложения. Однако в результате написания исходного кода программ у программистов-разработчиков часто возникают ошибки работы с памятью, которые могут приводить к потере информации, некорректному поведению системы, системным сбоям и отказам, что критично для систем реального времени.

Программная ошибка при работе с памятью - это ошибка, которую совершает разработчик на стадии кодирования ПО, связанная с некорректным динамическим выделением или освобождением сегментов оперативной памяти (ресурса).

Критичными для систем реального времени являются ошибки, пагубно сказывающиеся на времени реакции системы на внешние воздействия или на работоспособность системы в целом.

В настоящее время можно выделить 2 основных направления поиска ошибок в программном обеспечении: на статическом и на динамическом этапе отладки ПО [8].

На динамическом этапе отладке известны методы: анализ трасс выполнения, мониторинг, различные виды тестирования. В основе динамического этапа отладки программного обеспечения лежит применение средств анализа непосредственно во время работы исследуемой программы (например, средство анализа Valgrind [74], или Торнадо [59]). Применение таких средств может быть эффективным для обнаружения ошибок в процессе выполнения (runtime errors). Однако, помимо существенного снижения производительности тестируемой программы, данные средства проверяют корректность выполнения программы лишь на конечном множестве детерминированных наборов входных данных (тестов) и не могут гарантировать корректность работы исследуемой программы в процессе дальнейшей эксплуатации при произвольных наборах [81].

На статическом этапе отладке известны методы: дедуктивная верификации, верификация на основе проверки моделей, статический анализ. Статический этап отладки основан на анализе программного обеспечения, производимом без реального выполнения исследуемых программ. Анализ производится над исходным кодом проекта. Наиболее перспективным методом выявление программных ошибок при работе с памятью представляется статический анализ. Статический анализ позволяет охватывать весь исходный код проверяемых проектов, а процедура проверки не может повредить или изменить сам исходный код. К существующим алгоритмам статического анализа относятся: анализ потока управления, абстрактная интерпретация, анализ значений, включающий в себя интервальный анализ и анализ указателей; анализ зависимостей программы; обнаружение дефектов, анализ сложных программ, включающий в себя: анализ фи-функций, анализ циклов и межпроцедурный анализ [50].

На статическом этапе отладки в настоящее время не существует эффективных автоматизированных средств, специализирующихся на поиске ошибок при работе с памятью на языках С и С++, пригодных для применения в рассматриваемой предметной области. Основной задачей современных средств статического анализа (например, Coverity [72], Cppcheck [73]) является поиск логических и стилистических ошибок в исходном коде программного

обеспечения, а также выдача советов по оптимизации анализируемой программы. Указанные средства не позволяют охватить весь спектр программных ошибок при работе с памятью, возникает большое количество ложных срабатываний, кроме того эти средства тратят излишнее время для поиска указанных ошибок.

Исходя из сказанного, создание оптимальных методов и программно-инструментальных средств автоматизированного выявления программных ошибок при работе с оперативной памятью в сложных динамических системах, реализованных на языках программирования С и С++, является актуальной задачей.

Цель работы

Целью диссертационной работы является разработка и исследование методики обнаружения и локализации основных программных ошибок при работе с памятью на статическом этапе отладке программного обеспечения.

Объект и предмет исследования

Объектом исследования является программное обеспечение сложных динамических народно-хозяйственных и оборонных систем, включая системы реального времени.

Предметом исследования является процесс отладки программного обеспечения.

Научная задача исследования

Научную задачу исследования составляет разработка методики выявления программных ошибок при работе с памятью, позволяющей автоматизировано находить наиболее опасные для систем реального времени ошибки.

Решение общей задачи обеспечивается решением следующих частных

задач:

1) Критический анализ области, существующих подходов и инструментов обнаружения программных ошибок.

2) Классификация программных ошибок при работе с памятью в ПО.

3) Создание методики автоматизированного обнаружения программных ошибок при работе с памятью на основе анализа исходного кода ПО.

4) Создание на основе предложенной методики программного средства, позволяющего проводить анализ ПО на статическом этапе отладки за существенно меньшее время, чем существующие средства.

5) Сопоставительный анализ предложенного метода и инструментария с известными.

Научная новизна работы

Научная новизна работы состоит в следующем:

1) Разработана методика обнаружения и локализации основных программных ошибок при работе с памятью на статическом этапе отладке программного обеспечения.

2) Предложен метод анализа исходного кода ПО, реализованного на языках программирования С/С++, для выявления ОРП. Метод отличается тем, что вводится механизм контроля состояний сегментов памяти после построения промежуточного представления данных в режиме статической отладки. Метод позволяет выявлять наиболее опасные ошибки работы с памятью в исходном коде ПО на статическом этапе отладки за короткий промежуток времени.

3) Разработана модель состояний объектов памяти и основанные на этой модели правила выявления ОРП, в совокупности направленные на минимизацию затрат времени.

4) Предложена классификация ошибок, ориентированная на программные ошибки при работе с памятью, являющиеся критичными для систем реального времени.

5) Предложена структура программного средства отладки ПО, позволяющая обнаруживать ошибки работы с памятью в программном обеспечении на статическом этапе отладки за короткий промежуток времени.

6) Предложена система из четырёх показателей качества и методика сравнения по этим показателям программно-инструментальных средств выявления ошибок работы с памятью на статическом этапе отладки, использующая результаты работы этих средств на проектах ПО разного объёма и сложности.

Достоверность результатов

Достоверность представленных в настоящей работе положений и выводов подтверждена полученными результатами экспериментальных исследований разработанного прототипа программного средства MEDIS для отладки ПО.

Практическая значимость

Разработанная методика предназначена для автоматизации обнаружения программных ошибок при работе с памятью в программном обеспечении. Применение данной методики позволяет повысить качество как вновь разрабатываемых, так и уже созданных программных систем, а также снизить объем трудозатрат при отладке путем переноса основной нагрузки на статический этап. Предложенная методика может быть использована для выявления ОРП и в других приложениях, которые критичны к ошибкам такого рода.

Реализованный в рамках данной работы прототип средства обнаружения и локализации ошибок позволяет автоматизировано находить наиболее опасные ОРП за короткий промежуток времени.

Теоретические и практические результаты диссертационной работы могут являться основой для разработки промышленного средства выявления программных ошибок.

Реализация результатов работы

Реализацией результатов работы является прототип программного средства отладки MEDIS, в котором использован разработанный в диссертации метод. В работе продемонстрированы функциональные возможности созданного прототипа, а также его эффективность на реальных проектах ПО СРВ.

Результаты диссертационной работы используются в текущих разработках ПО, что подтверждается соответствующим актом (приложение А).

Апробация работы

Основные научные положения и результаты работы докладывались на научно-технических конференциях: «Взгляд в будущее 2011» [92], «Состояние, проблемы и перспективы создания корабельных информационно-управляющих комплексов 2011» [87], «Корабельные системы управления и обработки информации. Проектирование и изготовление 2011» [91], «Корабельные системы управления и обработки информации. Проектирование и изготовление 2011», «Взгляд в будущее 2012» [88], «Состояние, проблемы и перспективы создания корабельных информационно-управляющих комплексов 2012» [90], «Корабельные системы управления и обработки информации. Проектирование и изготовление 2012» [94], «Состояние, проблемы и перспективы создания корабельных информационно-управляющих комплексов 2013» [93].

Публикации

По результатам диссертационной работы опубликовано 12 статей, в том числе 3 в изданиях, рекомендованных ВАК.

Получено авторское Свидетельство о Государственной регистрации программы для ЭВМ №2013616813.

Положения, выносимые на защиту

1) Методика обнаружения и локализации основных программных ошибок при работе с памятью на статическом этапе отладке программного обеспечения, позволяющая повысить качество ПО и снизить трудозатраты на динамическом этапе отладки путем переноса основной нагрузки на статический этап.

2) Новый метод автоматизированного выявления программных ошибок при работе с памятью, позволяющий существенно снизить временные затраты при анализе ПО. У метода имеются следующие ограничения: малая чувствительность к потоку данных (кроме переменных, являющихся указателями на выделенную память) и потоку управления (кроме межпроцедурного анализа для функций-выделителей и освободителей памяти). Также данный метод не учитывает межпроцессное и межпоточное взаимодействие, не рассматриваются рекурсии.

3) Модель состояний объектов памяти и правила выявления ОРП.

4) Классификация ошибок при работе с памятью, позволяющая систематизировать исследуемую предметную область в соответствии с особенностями ПО.

5) Структура программного средства автоматизированного обнаружения и локализации ошибок, связанных с некорректной работой с памятью в ПО, эффективность которого продемонстрирована как на ряде специально подобранных модельных примеров, так и на реальных проектах.

6) Система из четырёх показателей качества и методика сравнения по этим показателям программно-инструментальных средств выявления ошибок работы с памятью на статическом этапе отладки.

Структура диссертационной работы

Диссертация состоит из введения, трех разделов, заключения, списка использованных источников, включающего 107 наименований.

Во введении обоснована актуальность исследуемой в диссертации задачи. Сформулированы положения, выносимые на защиту, обоснована их научная новизна и практическая значимость.

В первом разделе описаны источники и причины возникновения ошибок при работе с оперативной памятью и их классификация по литературным данным, приведен перечень типовых задач, решаемых современным программным обеспечением. Описаны функции выделения и освобождения памяти, рассмотрены существующие способы предотвращения и выявления ошибок при работе с памятью. Сформулирована задача исследования.

Во втором разделе описан понятийный аппарат и процедура формирования исходных данных для исследования. Описана разработанная классификация программных ошибок при работе с памятью, способных критически сказываться на работоспособности систем реального времени. Дана общая характеристика разработанного автором метода выявления ошибок работы с памятью на статическом этапе, предложена математическая модель состояний объектов памяти. Описан этап построения промежуточного

представления данных, состоящий из препроцессорной обработки, распознавания определений функций, построения графа вызовов функций и таблицы сведений по функциям работы с памятью. Предложен механизм контроля состояний памяти, состоящий из внутрипроцедурного анализа, межпроцедурного анализа и этапа выявления ошибок. Предложен этап формирования таблицы состояний памяти. Описана процедура генерации сообщений о выявленных ошибках. Выполнена оценка сложности разработанного алгоритма выявления ошибок при работе с памятью.

В третьем разделе приведены практические аспекты реализации результатов исследования. Описано разработанное специальное программно-инструментальное средство MEDIS, его назначение и основные требования, приведена его структура и особенности реализации. Приведены результаты испытаний MEDIS как на ряде специально подобранных типовых примерах, так и на реальных проектах. Предложена система из четырёх показателей качества и методика сравнения по этим показателям программно-инструментальных средств выявления ошибок работы с памятью на статическом этапе отладки, использующая результаты работы этих средств на проектах ПО разного объёма и сложности. Определена эффективность результатов исследования.

В заключении подведены итоги работы и обобщены ее основные результаты.

Диссертация содержит 136 страниц, 23 рисунка, 20 таблиц и 2 приложения.

1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ

В данном разделе описаны источники и причины возникновения ошибок при работе с оперативной памятью и их классификация, приведен перечень задач, решаемых современным ПО. Описаны функции выделения и освобождения памяти, проведён обзор различных подходов к классификации программных ошибок. Рассмотрены существующие способы предотвращения и выявления ошибок при работе с памятью, Проанализированы возможности и предложена модернизация существующего инструментального средства выявления программных ошибок СррсЬеск. Сформулирована задача диссертационного исследования.

Основные результаты данного раздела опубликованы в работах автора: [87,91,95].

1.1 Источники и причины возникновения ошибок при работе с оперативной памятью и их классификация

1.1.1 Проблематика ошибок в современном программном обеспечении

Современные темпы развития инфокоммуникационных технологий существенным образом влияют на индустрию программного обеспечения. Постоянно возрастает доля функций, реализованных программно, при этом стоимость программ постоянно снижается. Фирмы-разработчики программного обеспечения вынуждены с одной стороны сокращать сроки выпуска программных продуктов, а с другой стороны делать свои продукты более привлекательными и функциональными для потенциальных потребителей. Таким образом, сложность программ постоянно возрастает, при этом время разработки — сокращается. Естественным следствием таких тенденций является снижение качества программного обеспечения.

Другой важной тенденцией в программной индустрии является проникновение программно-управляемых систем в критически важные области человеческой жизни: военную, космическую, авиационную, медицинскую, финансовую.

Смещение технологических решений в программную область, сокращение сроков разработки приводят к тому, что низкокачественные программы начинают пагубно влиять на человеческую жизнь, здоровье, окружающую среду.

Рассмотрим известные случаи негативного влияния программного обеспечения на человечество, которое нанесло существенный ущерб.

• Гибель аппарата «Маринер-1. 22 июля 1962 года на 292 секунде после старта погиб несущий аппарат «Маринер-1». Аппарат потерял связь с

Землей, управление взяло на себя бортовое программное обеспечение, которое, как выяснилось позже, содержало ошибку. Расследование показало, что причина ошибки - опечатка в одном символе программы. Общий ущерб от данной ошибки составил 80 миллионов долларов США.

• Сбой в работе системы Patriot. 25 Февраля 1991 года сбой противоракетной системы Patriot во время войны в Персидском заливе привел к гибели 28 американских солдат и ранению более 100. Причина данного сбоя — ошибка округления, которая привела к рассинхронизации элементов системы и некорректному расчету координат иракской ракеты.

• Переоблучение пациентов ускорителем Therac-25. С 1981 по 1986 год медицинский ускоритель Therac был причиной многих существенных передозировок радиацией и нескольких смертей пациентов. Причина - ошибка управляющего программного обеспечения типа «race condition».

• Сбой ракеты-носителя Ариан-5. 4 июня 1996 года на территории Французской Гвианы на 39 секунде произошел автоподрыв ракеты-носителя, суммарный ущерб, нанесенный европейскому космическому агентству, оценивается в 7 миллиардов долларов США. Причина сбоя - возникновение необработанного исключения в программном модуле, унаследованном от ракеты-носителя Ариан-4, и не использующимся в штатном режиме Ариан-5.

• Сбои самолетов при полетах над Мертвым морем. Учебные полеты истребителей F16 над Мертвым морем приводили к сбоям навигационной системы, которая пыталась перевернуть самолет. Причина ошибки — значение, приходящее с датчика высоты. При полетах над Мертвым морем датчик выдавал нулевые или отрицательные значения высоты, которые некорректно интерпретировались навигационной системой истребителя. Программное обеспечение отлаживалось только в условиях, когда самолет находился над уровнем моря.

• Авария в энергосистеме в США и Канаде. 14 августа 2003 года произошел сбой в объединенной энергосистеме США и Канады. Около 50 миллионов человек остались без электричества. Суммарный ущерб эксперты оценили в 6 миллиардов долларов США. Причина данного сбоя - ошибка, называемая «гонка условий» [50].

По данным компании Coverity [72], в программах на языке С, в среднем, содержится 0.25 нефункциональных ошибок на 1000 строк исходного кода.

Приведенные примеры негативного влияния ошибок в программах на важные сферы деятельности, здоровье и жизни людей показывают, что качество

программного обеспечения - важнейшая его характеристика, и улучшение ее -одна из актуальнейших задач сферы информационных технологий.

Ошибки работы с памятью составляют существенную долю среди всего спектра ошибок программного обеспечения и являются особо критичными для систем реального времени. Считается, что данный тип ошибок является одним из самых труднообнаруживаемых [107].

В процессе программирования возникают ситуации, когда заранее не известно, сколько объектов - чисел, строк текста и прочих данных будет хранить программа. В таком случае используется динамическое выделение памяти [105]. Помимо этого динамическое выделение памяти используется при работе с большими объемами данных.

В СРВ для ускорения обращений приложений к ядру работа ядра и приложений организована в одном и том же привилегированном режиме, однако при этом отсутствует надежная защита памяти, занимаемой модулями ОС, от некорректно работающего приложения.

В результате написания исходного кода программ у программистов-разработчиков часто возникают ошибки работы с памятью, которые могут приводить к потере информации, некорректному поведению системы, системным сбоям и отказам, что критично для рассматриваемых систем реального времени.

Для того чтобы осуществить поиск ошибок работы с памятью следует определить и дать краткую характеристику функциям выделения и освобождения памяти.

1.1.2 Функции динамического распределения памяти

Оперативная память - энергозависимая часть системы компьютерной памяти, в которой временно хранятся данные и команды, необходимые процессору для выполнения им операции [70]. Обязательным условием является адресуемость (каждое машинное слово имеет индивидуальный адрес) памяти.

Особая роль памяти объясняется тем, что процессор может выполнять инструкции программы только в том случае, если они находятся в памяти. Память распределяется как между модулями прикладных программ, так и между модулями самой операционной системы.

В ранних операционных системах (ОС) управление памятью сводилось только к загрузке программы и ее данных из внешнего накопителя (магнитного диска, магнитной ленты или перфоленты) в память. С появлением мультипрограммирования перед ОС были поставлены новые задачи, связанные с распределением имеющейся памяти между несколькими одновременно

выполняющимися программами.

Многозадачность - свойство операционной системы или среды программирования обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких процессов [104].

Функциями ОС по управлению памятью в операционной системе являются:

• отслеживание свободной и занятой памяти;

• выделение памяти процессам и освобождение памяти по завершении процессов;

• вытеснение кодов и данных процессов из оперативной памяти на диск (полное или частичное), когда размеры основной памяти не достаточны для размещения в ней всех процессов, и возвращение их в обратно оперативную память, когда в ней освобождается место;

• настройка адресов программы на конкретную область физической памяти.

Кроме первоначального выделения памяти процессам при их создании операционная система также должна заниматься динамическим распределением памяти, то есть выполнять запросы приложений на выделение им дополнительной памяти во время выполнения. После того как приложение перестает нуждаться в дополнительной памяти, оно может вернуть ее операционной системе. Выделение памяти произвольной длины в произвольные моменты времени из общего пула памяти приводит к фрагментации и, вследствие этого, к ее неэффективному использованию. Дефрагментация памяти также является функцией операционной системы.

Основу системы динамического распределения в С составляют функции mallocQ и free() [60]. Эти функции работают совместно. Функция mallocQ выделяет память, a freeQ — освобождает ее. Это означает, что при каждом запросе функция mallocQ выделяет требуемый участок свободной памяти, а freeQ - освобождает его, то есть возвращает программе (системе). В программу, использующую эти функции, должен быть включен заголовочный файл <stdlib.h>.

Прототип функции mallocQ) следующий:

void *malloc(size_t количество байтов);

Здесь количество байт - размер памяти, необходимой для размещения данных (тип size_t определен в <stdlib.h> как некоторый целый тип без знака).

Функция mallocQ возвращает указатель типа void *, поэтому его можно присвоить указателю любого типа. При успешном выполнении функция

mallocQ возвращает указатель на первый байт непрерывного участка памяти, выделенного в динамически распределяемой области памяти. Если в динамически распределяемой области памяти недостаточно свободной памяти для выполнения запроса, то память не выделяется и функция mallocQ возвращает нуль (NULL).

Функция free() противоположна функции mallocQ в том смысле, что она возвращает системе участок памяти, выделенный ранее с помощью функции mallocQ. Иными словами, она освобождает участок памяти, который может быть вновь использован функцией mallocQ. Функция freeQ имеет следующий прототип:

void free(void *р)

Здесь р - указатель на участок памяти, выделенный перед этим вызовом функции mallocQ. Если указатель не был получен с помощью функции mallocQ, то его освобождение является грубой ошибкой [60].

Подсистема динамического распределения в С используется совместно с указателями для создания различных программных конструкций, таких как связные списки и двоичные деревья.

Похожие диссертационные работы по специальности «Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей», 05.13.11 шифр ВАК

Список литературы диссертационного исследования кандидат наук Тетерев, Михаил Александрович, 2013 год

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. A Survey of С and С++ Software Tools for Computational Science. Science and Technologies Facility Council. Chilbolton, Daresbury, and Rutherford Appleton Laboratories. - 2009. - P. 14.

2. Bach M. The design of the UNIX operating system. - Prentice Hall, Englewood Cliffs, 1986.

3. Clohessy K., Using object-oriented programming tools to build real-time embedded systems. - Real-time engineering, 1996.

4. Cravotta N. Real-time operating systems. - Embedded system programming, 1997.

5. Damodaran-Kamal S.K., Francioni J.M. Nondeterminacy: testing and debugging in message passing parallel programs. - ACM, 1993.

6. Dewhurst S., Stark K. Programming in С++. - Prentice Hall, 1989.

7. Distributed real-time systems. Monitoring, visualization, debugging, and analysis / Tsai J., Bi Y., Yang S., Smith R. - Wiley-Interscience Publication, 1996.

8. Eigler, Mudflap Pointer Use Checking for C/C++. - Proceedings of the GCC Developers Summit, 2003, p. 57-70.

9. Ellis M., Stroustrup B. The annotated С++ Reference Manual. -Addison-Wesley, 1990.

10. Encontre V. How to use modeling to implement verifiable, scalable, and efficient real-time application programs. - Real-time engineering, 1997.

11. Francioni J.M., Albright L., Jackson J.A. Debugging parallel programs using sound. - ACM, 1991.

12. Generalized algorithmic debugging and testing / Fritzson P., Gyimothy Т., Kamkar M., Shahmehri N. - ACM, 1991.

13. ISO/IEC 9899:201x.

14. ISO/IEC 9945-1, ANSI/IEEE Std 1003.1. - New York: IEEE, 1996. -ISBN 1-55937-573-6.

15. It's all a question of time. - Real-time magazine, 1997.

16. Jeffery C., Zhou W., Templer K., Brazell M. A lightweight architecture for program execution monitoring. - ACM SIGPLAN, 1998.

17. John R. Levine, Linkers and Loaders. - Morgan-Kauffman, 1999.

18. Kunz T. Process clustering for distributed debugging. - ACM, 1993.

19. Lang J., Stewart O.B. A study of the applicability of existing exception-handling techniques to component-based real-time software technology. - ACM, 1998.

20. Locke C.D. Fundamentals of Real-Time. - Lockhead Martin, 1998.

21. May J., Berman F. Panorama: a portable, extensible parallel debugger. -ACM, 1993.

22. Mayrhauser A, Vans A.M. Program understanding behavior during debugging of large scale software. - ACM, 1997.

23. Mittag L. Multitasking design and implementation.- Embedded system programming, 1998.

24. Offutt A.J., Hayes J.H. A semantic model of program faults. - ACM,

1996.

25. Osawa N., Morita H., Yuba T. Animation for perfomance debugging of parallel computing systems. - ACM, 1997.

26. R.O'Farrel, Choosing a cross-debugging methodology. - Embedded systems programming, 1997.

27. Ready J. Distributed applications bend RTOS rules. - CMP Media Inc,

1996.

28. Realtime CORBA. - Issue 1.0.- White Paper, 1996.

29. Richter J. Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework. - Parts 1 & 2. - MSDN Magazine, 2000.

30. Ryherd E. Software debugging on a single-chip system. - Embedded system programming, 1998

31. Stroemme J.E. Integrated testing and debugging of concurrent software systems // The sixth IFIP/ICCC conference on information network and data communication, Trondheim, Norway, 1996.

32. The Ariadne debugger: scalable application of event-based abstraction / Cuny J., Forman G., Hough A., Kundu J., Lin C., Snyder L., Stemple D. - ACM, 1993.

33. Timmerman M., Gielen F., Lambrix P. High level tools for the debugging of real-time multiprocessor systems. - ACM, 1993.

34. Zernik D., Rudolph L. Animating work and time for debugging parallel programs. Foundation and experience. - ACM, 1991.

35. А. А. Жданов. Операционные системы реального времени [Электронный ресурс]. URL: http://www.asutp.ru/?p=600591.

36. Алгоритмы: построение и анализ / Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. - 3-е изд. - М.: Вильяме, 2009.

37. Алексеев В.Е., Ваулин. А.С. Электронные вычислительные машины. Кн. 7: Практикум по программированию. - 1991.

38. Альфред А., Сети Р., Джефри У. Компиляторы: принципы, технологии и инструменты. - 2-е изд. - М.: Вильяме, 2008.

39. Базара М., Шетти К. Нелинейное программирование. Теория и алгоритмы. М.: Физматлит, 1989.

40. Банахан М., Раттер Э. Введение в операционную систему UNIX. -М.: Радио и связь, 1986.

41. Баурн С. Операционная система UNIX. - М.: Мир, 1986.

42. Берри Р., Микинз Б. Язык Си. Введение для программистов. - М.: Финансы и статистика, 1988.

43. Болски М. Язык программирования Си. Справочник. - М.: Радио и связь, 1988.

44. Бочков С.О., Субботин Д.Н. Язык программирования Си для персонального компьютера. - М.: Диалог: Радио и связь, 1990. - 383с.

45. Брауде Э. Технология разработки программного обеспечения. - М.: Финансы и статистика, 2004.

46. Браун П. Введение в операционную систему UNIX. - М.: Мир, 1987.

47. Бройдо B.JI. Вычислительные системы, сети и телекоммуникации: Учебник для вузов. - СПб.: Питер, 2002. - 688с.

48. Ветров С. Компьютерное «железо». - М.: COJIOH-P, 2002. - 559с.

49. Гирш Э.А. Сложность вычислений и основы криптографии. - М.: Вильяме, 2010.

50. Глухих М.И., Ицыксон В.М. Программная инженерия. Обеспечение качества программных средств методами статического анализа: Учебное пособие. - СПб: Изд-во Политехи, ун-та, 2011. - 150с.

51. Горошко Е., Операционные системы реального времени. - ИРЭ HAH Украины, 2000.

52. Готье Р. Руководство по операционной системе UNIX. - М.: Финансы и статистика, 1986.

53. Гук М. Аппаратные средства локальных сетей. Энциклопедия. -СПб.: Питер, 2000. - 576с.

54. Дансмур М., Дейвис Г. ОС UNIX и программирование на языке Си. - М.: Радио и связь, 1989.

55. Дердж Ж., Мюссер Д., Сейни А. С++ и STL: справочное руководство. - 2-е издание. - М.: Вильяме, 2010. - 432с.

56. Зима В. Безопасность глобальных сетевых технологий. - СПб.: BHV, 2001.-320с.

57. Золотарев С. Операционные системы реального времени для 32-разрядных микропроцессоров [Электронный ресурс]. URL: www.rtsofl.ru/press/articles/detail.php?ID=1486

58. Инструментальная мобильная операционная система ИНМОС / Беляков М., Ливеровский А., Семик В., Шяудкулис В. - М.: Финансы и статистика, 1985.

59. Каталог программных продуктов для систем специального назначения: оборона, авиация, космос, связь [Электронный ресурс]. URL: www.rtsoft.ru.

60. Керниган Б., Ритчи Д. Язык программирования Си. - 2-е изд. - М.: Вильяме, 2007. - 304с.

61. Колмогоров А. Н. Теория информации и теория алгоритмов. — М.: Наука, 1987. - 304с.

62. Кристиан К. Введение в операционную систему UNIX. - М.: Финансы и статистика, 1985.

63. Липаев В.В., Филинов E.H. Мобильность программ и данных в открытых информационных системах. - РФФИ, 1997.

64. Липаев, В. В. Программная инженерия. Методологические основы. - М.:ТЕИС, 2006. - 608с.

65. Лифшиц Ю. Современные задачи теоретической информатики. -М.: Вильяме, 2003.

66. Магьюир С. Создание надёжного кода.- Майкрософт пресс, 1993.

67. Мак-Коннел С. Совершенный код,- Майкрософт пресс, 1993.

68. Малиновский Б. Н. БИС ЗУ для построения внутренней памяти // Справочник по персональным ЭВМ. - К.: Тэхника, 1990. - 384с.

69. Морозевич А.Н. Основы информатики: Учебное пособие для студентов вузов. - М.: Новое знание, 2001. - 544с.

70. Мюллер С. Оперативная память // Модернизация и ремонт. - 17-е изд. - М.: Вильяме, 2007, С. 499—572.

71. Описание лексического анализатора. URL: http://www.chernyshov.com/SPPO_5/TRANS/_termins235.htm.

72. Описание средства отладки Coverity [Электронный ресурс]. URL: http://www.coverity.com/

73. Описание средства отладки cppcheck [Электронный ресурс]. URL: http://cppcheck.sourceforge.net.

74. Описание средства отладки Valgring [Электронный ресурс]. URL: http://valgrind.org.

75. Описание средства разработки программного обеспечения в UNIX-подобных системах [Электронный ресурс]. URL: http://www.kdevelop.org.

76. Описание утечек памяти // Электронный журнал «Хакер». URL: http://www.xakep.ni/post/41631/default.asp.

77. Описание утилиты make [Электронный ресурс]. URL: https://www.gnu.org/software/make.

78. Орлов С. А. Технологии разработки программного обеспечения: Разработка сложных программных систем. - 3-е изд. - М.: Мир, 2004.

79. Пирогов В.Ю. Ассемблер и дизассемблирование. - СПб.: БХВ-Петербург, 2006. - 464с.

80. Прата С. Язык программирования С++ (С++11). Лекции и. - 6-е изд. - М.: Вильяме, 2012. — 1248с.

81. Пучков Ф. М., Шапченко К. А. Статический метод анализа программного обеспечения на наличие угроз переполнения буферов. -Программирование, 2005, С. 19-34.

82. Себеста Р. Компьютер IBM 704 и язык Фортран // Основные концепции языков программирования. - 5-е изд. - М.: Вильяме, 2001.- 672с.

83. Сик Д., Ли Л., Ламсдэйн Э. С++ Boost Graph Library. - Питер, 2006. -

304с.

84. Соммервилл И. Инженерия программного обеспечения. - М.: Вильяме, 2002.

85. Сэвидж Д. Сложность вычислений. - М.: Факториал, 1986.

86. Тетерев М. А. Анализ функционирования современных поисковых систем // Дни студенческой науки осень - 2009:сборник научных трудов. / Московский Государственный Университет Экономики, Статистики и Информатики, Москва 2009. С. 76-83.

87. Тетерев М.А. Анализ современных средств контроля памяти в программном обеспечении. // Состояние, проблемы и перспективы создания корабельных информационно-управляющих комплексов: сб. докладов научно-технической конференции, 2011.

88. Тетерев М.А. Инструментальное средство "DIME" выявления ошибок работы с памятью специального программного обеспечения // Сборник докладов X молодежно-технической конференции "Взгляд в будущее". / ОАО "ЦКБМТ "Рубин", С-Петербург, 2012. - С. 659-665.

89. Тетерев М.А. Метод и средство автоматизированного поиска ошибок работы с памятью в специальном программном обеспечении // Сборник докладов молодежной научно-технической конференции, посвященной 65-летию ОАО «ГРЦ МАКЕЕВА» / ОАО «Государственный ракетный центр имени академика В. П. Макеева», 2012. - С.151-156.

90. Тетерев М.А. Обнаружение и локализация ошибок специального программного обеспечения, связанных с распределением сегментов оперативной памяти // Состояние, проблемы и перспективы создания

корабельных информационно-управляющих комплексов: сб. докладов научно-технической конференции, 2012.

91. Тетерев М.А. Построение графа вызовов функций для поиска ошибок работы с памятью в СПО. // Корабельные системы управления и обработки информации. Проектирование и изготовление: сб. докладов научно-технической конференции. / ОАО "Концерн "Научно-производственное объединение "Аврора", С-Петербург, 2011. - С. 66-68.

92. Тетерев М.А. Применение метода статического анализа для поиска ошибок работы с памятью в СПО. // Сборник докладов IX молодёжно-технической конференции "Взгляд в будущее". / ОАО "ЦКБМТ "Рубин", С-Петербург, 2011. - С. 567-572.

93. Тетерев М.А. Крылов Д.А., Валяев А.Н. Статическое выявление ошибок работы с памятью в специальном программном обеспечении // Состояние, проблемы и перспективы создания корабельных информационно-управляющих комплексов: сб. докладов научно-технической конференции, 2013.

94. Тетерев М.А., Крылов Д.А. Метод диагностики программных дефектов при работе с памятью в системах реального времени // Корабельные системы управления и обработки информации. Проектирование и изготовление: сб. докладов научно-технической конференции. / ОАО "Концерн "Научно-производственное объединение "Аврора", 2012.

95. Тетерев М.А., Губонин Н.С. Анализ способов предотвращения ошибок работы с памятью в программном обеспечении // Вестник МЭИ, 2013, №5.

96. Тетерев М.А., Губонин Н.С. Выявление программных ошибок при работе с памятью в исходном коде // Вестник МЭИ, 2013, №5.

97. Тетерев М.А., Губонин Н.С. Метод и инструментальное средство MEDIS обнаружения и локализации ошибок при работе с памятью в программах, написанных на языках С и С++. Приборы и системы. Управление, контроль, диагностика, 2013, №9 С.21-27.

98. Тюлин А., Жуков И., Ефанов Д. На страже конфиденциальной информации. - 10-е изд. - Открытые системы, 2001.

99. Уэйт М., Прата С., Мартин Д. Язык Си. Руководство для начинающих. - М.: Мир, 1988.

100. Хантер Р. Проектирование и конструирование компиляторов / Пер. с англ. - М.: Финансы и статистика, 1984. - 232с.

101. Хантер Р. Основные концепции компиляторов - М.: Вильяме, 2002,

256с.

102. Хеш-таблицы / Кормен, Т., Лейзерсон, Ч., Ривест Р., Штайн, К. - 2-е изд. - М.: Вильяме, 2005. - 1296с.

103. Хэнкок Л., Кригер М. Введение в программирование на языке Си. -М.: Радио и связь, 1986.

104. Шилдт Г. Полный справочник по Java. - 7-е изд.: Пер. с англ.-М.ЮОО «И. Д. Вильяме», 2007, С. 253—254.

105. Шилдт. Г. С: полное руководство, классическое издание. - М.: Вильяме, 2010.-704с.

106. Электронная энциклопедия [Электронный ресурс]. URL: http://www.wikipedia.org.

107. Электронное файловое хранилище кафедры ИКТ [Электронный ресурс]. URL: share.auditory.ru.

Обратите внимание, представленные выше научные тексты размещены для ознакомления и получены посредством распознавания оригинальных текстов диссертаций (OCR). В связи с чем, в них могут содержаться ошибки, связанные с несовершенством алгоритмов распознавания. В PDF файлах диссертаций и авторефератов, которые мы доставляем, подобных ошибок нет.