Статический анализатор уязвимости многопоточных программ на языке С++

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 20.09.2016
Размер файла 755,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Министерство образования и науки Российской Федерации

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ

УНИВЕРСИТЕТ имени академика С.П.КОРОЛЕВА

(НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ (СГАУ)»

Факультет информатики

Кафедра геоинформатики и информационной безопасности

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе по дисциплине

«Инженерия программного обеспечения»

на тему «Статический анализатор уязвимости многопоточных программ на языке С++»

Выполнил:

студент группы 6410

Койнов А.С.

Проверил:

Мостовой Я.А.

САМАРА 2016

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

ПОСТАНОВКА ЗАДАЧИ

СТРУКТУРА ПРОГРАММЫ

ИНСТРУКЦИЯ ПО РАБОТЕ

РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ПРОГРАММЫ

ЛИСТИНГ ПРОГРАММЫ

ВЫВОД

СПИСОК ЛИТЕРАТУРЫ

ВВЕДЕНИЕ

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

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

ПОСТАНОВКА ЗАДАЧИ

Должна быть составлена программа, обеспечивающая проверку уязвимости многопоточного ПО на С++ к ошибкам синхронизации «гонки» и «заброшенные замки».

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

СТРУКТУРА ПРОГРАММЫ

программный синхронизация язык ошибка

Программа состоит из следующих блоков:

1) Флажок выбора типа уязвимости анализируемой программы.

2) Меню выбора файла анализируемой программы.

3) Алгоритм поиска ошибок синхронизации многопоточного ПО:

а) осуществляющий поиск ошибки синхронизации типа «гонки»

б) осуществляющий поиск ошибки синхронизации типа «заброшенные замки»

4) Сохранение полученных результатов в массиве.

5) Вывод результата на экран.

Структурная схема программы приведена ниже:

ИНСТРУКЦИЯ ПО РАБОТЕ

1) Для запуска программы необходимо открыть файл Analiztator.exe После этого, должно открыться окно программы, представленное на рисунке 1.

Рисунок 1

2) Для выбора типа проверки, необходимо поставить галочки на соответствующих пунктах (рисунок 2).

Рисунок 2

3) Для выбора программы на проверку, необходимо нажать на кнопку «файл», затем на кнопку «открыть» и выбрать нужную программу через проводник (рисунок 3).

Рисунок 3

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

Рисунок 4

5) Для сохранения полученной информации, необходимо нажать на кнопку «файл», затем на кнопку «сохранить лог» и выбрать место сохранения лога через проводник (рисунок 5).

Рисунок 5

6) Для выхода из системы необходимо нажать «файл», затем «выход» (рисунок 6).

Рисунок 6

РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ПРОГРАММЫ

1) Реакция анализатора на штатное ПО без потенциальных ошибок:

А) Тестирование на наличие «гонок»:

Б) Тестирование на наличие «заброшенных замков»:

2) Реакция анализатора на ПО, содержащее ошибку синхронизации типа «гонки»:

3) Реакция анализатора на ПО, содержащее ошибку синхронизации типа «заброшенные замки»:

ЛИСТИНГ ПРОГРАММЫ

using Microsoft.Win32;

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text;

using System.Text.RegularExpressions;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

namespace Analyzator

{

/// <summary>

/// Логика взаимодействия для MainWindow.xaml

/// </summary>

public partial class MainWindow: Window

{

LinkedList<string> content = new LinkedList<string>();

Regex mutexLock = new Regex(@"[\._]lock[\(\)]");

Regex unlockMutex = new Regex(@"[\._]unlock[\(\)]");

Regex variableRegex = new Regex(@"^\s*(extern\s+)?(unsigned|signed)?\s*(const\s+)?(int|short|char|long|double|float|byte).*(;)");

Parser parser = new Parser();

List<Variable> allVariables = new List<Variable>();

int linesNumber = 0;

int leftMutexes = 0;

private void OpenFile()

{

OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.Multiselect = true;

if (openFileDialog.ShowDialog() == true)

{

file1TextBox.Document.Blocks.Clear();

logTextBox.Clear();

if (allVariables.Count > 0) {

allVariables.Clear();

}

string[] safeFileNames = openFileDialog.SafeFileNames;

int index = 0;

List<Variable> variables = new List<Variable>();

foreach (string fileName in openFileDialog.FileNames)

{

//file1TextBox.AppendText(file);

if (File.Exists(fileName)) {

/*file1TextBox.AppendText("-----------------------------------");

file1TextBox.AppendText(Environment.NewLine);*/

string saveFileName = safeFileNames[index++];

file1TextBox.AppendText("Файл: " + saveFileName);

file1TextBox.AppendText(Environment.NewLine);

file1TextBox.AppendText("----------------------------");

file1TextBox.AppendText(Environment.NewLine);

linesNumber = 1;

string[] lines = File.ReadAllLines(fileName);

foreach (string line in lines)

{

file1TextBox.AppendText(linesNumber + ". " + line + Environment.NewLine);

linesNumber++;

}

file1TextBox.AppendText(Environment.NewLine);

parser.ReadFile(fileName, saveFileName);

variables = parser.getVariables();

foreach (Variable variable in variables)

{

allVariables.Add(variable);

}

//searchMutexes(lines);

if (mutexesCheckBox.IsChecked == true)

{

searchMutexes(lines, saveFileName);

}

}

}

}

if (racesCheckBox.IsChecked == true)

{

searchRaces();

}

if (racesCheckBox.IsChecked == false && mutexesCheckBox.IsChecked == false)

{

logTextBox.AppendText("Ни одная уязвимость не выбрана" + Environment.NewLine);

}

}

public MainWindow()

{

InitializeComponent();

file1TextBox.IsReadOnly = true;

logTextBox.IsReadOnly = true;

}

private void MenuItem_Click(object sender, RoutedEventArgs e)

{

OpenFile();

}

public void parseArray(string[] arr)

{

Match lockMatch = null;

Match unlockMatch = null;

if (content.Count > 0)

{

content.Clear();

}

int lineNumber = 1;

leftMutexes = 0;

foreach (string str in arr)

{

lockMatch = mutexLock.Match(str);

unlockMatch = unlockMutex.Match(str);

if (lockMatch.Success)

{

leftMutexes++;

content.AddLast(lineNumber + "." + str.Trim() + " возможно заброшенный замок");

} else if (unlockMatch.Success)

{

leftMutexes--;

}

lineNumber++;

}

}

private void writeToTextBox(string fileName)

{

foreach (string str in content)

{

logTextBox.AppendText(fileName + " " + str + Environment.NewLine);

}

}

public void printNoLeftMutex(string fileName)

{

logTextBox.AppendText("Заброшенных мьютексов в файле " + fileName + " не найдено" + Environment.NewLine);

}

public void searchRaces()

{

for (int i = 0; i < allVariables.Count - 1; i++)

{

List<string> sameVariables = new List<string>();

sameVariables.Add(allVariables[i].fullName);

for (int j = i + 1; j < allVariables.Count; j++)

{

if (allVariables[i].name == allVariables[j].name)

{

sameVariables.Add(allVariables[j].fullName);

}

}

if (sameVariables.Count > 1)

{

foreach (string str in sameVariables)

{

logTextBox.AppendText(str + " - использование одинакового имени переменной, возможны гонки" + Environment.NewLine);

}

}

}

}

public void searchMutexes(string [] arr, string saveFileName)

{

parseArray(arr);

if (leftMutexes > 0)

{

writeToTextBox(saveFileName);

} else

{

printNoLeftMutex(saveFileName);

}

}

private void MenuItem_Click_1(object sender, RoutedEventArgs e)

{

SaveFileDialog saveFileDialog1 = new SaveFileDialog();

saveFileDialog1.Filter = "Text files(*.txt)|*.txt|All files(*.*)|*.*";

if (saveFileDialog1.ShowDialog() == false)

{

return;

}

else

{

string name = saveFileDialog1.FileName;

string saveFileName = saveFileDialog1.SafeFileName;

// Write to the file name selected.

//... You can write the text from a TextBox instead of a string literal.

System.IO.File.WriteAllText(name, logTextBox.Text);

MessageBox.Show("Файл " + saveFileName + " был успешно сохранен");

}

}

private void MenuItem_Click_2(object sender, RoutedEventArgs e)

{

Application.Current.Shutdown();

}

}

}

ВЫВОД

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

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

СПИСОК ЛИТЕРАТУРЫ

1. Форстер Дж., Лю В. Разработка средств безопасности и эксплойтов/Пер. с англ. - М.: Издательство «Русская Редакция»; СПб.: Питер,2007. -432 стр.

2. Майкл Ховард, Девид Лебланк, Джон Виега «Уязвимости в программном коде и борьба с ними». -М.: ДМК Пресс 2011, 288.

3. Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного программирования.: Пер.с англ. - М.: Издательский дом "Вильямс", 2003. - 512 c.

4. Информационно-аналитические материалы по параллельным вычислениям (http://www.parallel.ru, http://www.ccas.ru, www.mcs.anl.gov).

5. Немнюгин С.А., Стесик О.Л. Параллельное программирование для многопроцессорных вычислительных систем. -СПб.: Петербург, 2002.

6. https://ru.wikipedia.org/

Размещено на Allbest.ru


Подобные документы

  • Разработка и реализация алгоритма динамического контроля корректности использования директив OpenMP в программах, написанных на языке Fortran. Минимизация количества потребляемых ресурсов при работе отладчика. Сравнительный обзор существующих отладчиков.

    дипломная работа [83,0 K], добавлен 14.10.2010

  • Технология разработки и внедрения программного обеспечения автоматизированной системы управления. Классификация ошибок в программах на этапе эксплуатации системы и общие задачи процесса ее отладки. Методы обнаружениея и локализации ошибок в программах.

    контрольная работа [480,4 K], добавлен 25.10.2010

  • Использование в программах, написанных на языке C, Windows application programming interfaces. Роль центрального процессора. Архитектура Фон Неймана. Оперативная память. Графическая плата. Создание интерфейса программы. Разработка машинного кода.

    реферат [101,5 K], добавлен 15.05.2014

  • Создание программы для перевода кодов с языка Pascal на язык Си. Обработка программ операторами case, assign, rewrite и write. Способы объявления файла, комментария, переменных, логических и арифметических выражений. Виды синтаксических анализаторов.

    курсовая работа [461,0 K], добавлен 03.07.2011

  • Основные понятия и назначение технологии JavaBeans, ее компоненты и принцип работы, преимущества. Методика создания jar файлов в среде Eclipse. Структура файлов манифеста. Создание многопоточных приложений. Изучение визуального редактора Java BeanBox.

    лабораторная работа [67,4 K], добавлен 30.06.2009

  • Схема разбора арифметического и логического выражения. Внешняя спецификация конвертора и алгоритм перевода программ на языке Паскаль в текст на языке Си. Назначение подпрограмм, особенности констант и переменных. Код программы и ее тестирование.

    курсовая работа [567,5 K], добавлен 03.07.2011

  • Совокупность программ, используемых в работе на компьютере. Функциональное назначение программного обеспечения, правовые нормы его использования. Операционная система и сервисные программы. Разработка компьютерных программ на языке программирования.

    презентация [5,0 M], добавлен 10.10.2016

  • Анализ затрат и прибыли. Создание программного проекта для решения задачи о прибыли и убытках на языке программирования C#. Использование функций и переменных, компиляция программы. Алгоритмы и структуры данных. Тестирование программного обеспечения.

    курсовая работа [1,2 M], добавлен 03.01.2015

  • Этапы разработки программного приложения, выполняющего синтаксический анализ программы на языке С и форматирование текста программы на языке С. Требования к программному обеспечению и интерфейсу. Конфигурация технических средств и оценка надежности.

    курсовая работа [1,6 M], добавлен 22.06.2011

  • Обзор существующих моделей параллельного программирования, основные средства отладки эффективности MPI-программ, общие проблемы всех средств трассировки. Создание экспериментальной системы отладки эффективности MPI-программ, этапы работы анализатора.

    дипломная работа [767,2 K], добавлен 14.10.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.