Статический анализатор уязвимости многопоточных программ на языке С++
Министерство
образования и науки Российской Федерации
ФЕДЕРАЛЬНОЕ
ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САМАРСКИЙ
ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ
УНИВЕРСИТЕТ
имени академика С.П.КОРОЛЕВА
(НАЦИОНАЛЬНЫЙ
ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ (СГАУ)»
Факультет
информатики
Кафедра
геоинформатики и информационной безопасности
ПОЯСНИТЕЛЬНАЯ
ЗАПИСКА
к
курсовой работе по дисциплине
«Инженерия
программного обеспечения»
на
тему «Статический анализатор уязвимости многопоточных программ на языке С++»
Выполнил:
студент группы 6410
Койнов А.С.
Проверил:
Мостовой Я.А.
САМАРА
2016
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
ПОСТАНОВКА ЗАДАЧИ
СТРУКТУРА ПРОГРАММЫ
ИНСТРУКЦИЯ ПО РАБОТЕ
РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ПРОГРАММЫ
ЛИСТИНГ ПРОГРАММЫ
ВЫВОД
СПИСОК ЛИТЕРАТУРЫ
ВВЕДЕНИЕ
Многопоточность - свойство
платформы или приложения, состоящее в том, что процесс, порождённый в
операционной системе, может состоять из нескольких потоков, выполняющихся
«параллельно», то есть без предписанного порядка во времени. При выполнении
некоторых задач такое разделение может достичь более эффективного использования
ресурсов вычислительной машины.
Наряду с очевидными
преимуществами, многопоточность - одна из сложнейших областей программирования.
Малейшая невнимательность может привести к появлению трудноуловимых «плавающих
ошибок». В связи с этим, возникает необходимость в создании анализатора
уязвимости многопоточных программ, который мог бы автоматически выявлять
типичные ошибки синхронизации многопоточного программного обеспечения.
ПОСТАНОВКА ЗАДАЧИ
Должна быть составлена
программа, обеспечивающая проверку уязвимости многопоточного ПО на С++ к
ошибкам синхронизации «гонки» и «заброшенные замки».
Должна быть приведена
структурная схема программы с описанием её работы, инструкция по работе с
программой и результаты работы данной программы на тестовом ПО.
СТРУКТУРА ПРОГРАММЫ
программный
синхронизация язык ошибка
Программа состоит из следующих
блоков:
) Флажок выбора типа
уязвимости анализируемой программы.
) Меню выбора файла
анализируемой программы.
) Алгоритм поиска ошибок
синхронизации многопоточного ПО:
а) осуществляющий поиск ошибки
синхронизации типа «гонки»
б) осуществляющий поиск ошибки
синхронизации типа «заброшенные замки»
) Сохранение полученных
результатов в массиве.
) Вывод результата на экран.
Структурная схема программы
приведена ниже:
ИНСТРУКЦИЯ ПО
РАБОТЕ
1) Для запуска программы
необходимо открыть файл Analiztator.exe
После этого, должно открыться окно программы, представленное на рисунке 1.
Рисунок 1
2) Для выбора типа
проверки, необходимо поставить галочки на соответствующих пунктах (рисунок 2).
Рисунок 2
3) Для выбора программы на
проверку, необходимо нажать на кнопку «файл», затем на кнопку «открыть» и
выбрать нужную программу через проводник (рисунок 3).
Рисунок 3
) При выборе проверяемой
программы, её содержимое будет отображаться в левой части окна. В правой части
окна показаны потенциальные ошибки синхронизации, их тип и номера строк кода, в
которых они были обнаружены (рисунок 4).
Рисунок 4
5) Для сохранения
полученной информации, необходимо нажать на кнопку «файл», затем на кнопку
«сохранить лог» и выбрать место сохранения лога через проводник (рисунок 5).
Рисунок 5
) Для выхода из системы
необходимо нажать «файл», затем «выход» (рисунок 6).
Рисунок 6
РЕЗУЛЬТАТЫ
ТЕСТИРОВАНИЯ ПРОГРАММЫ
1) Реакция анализатора на
штатное ПО без потенциальных ошибок:
А) Тестирование на наличие
«гонок»:
Б) Тестирование на наличие
«заброшенных замков»:
) Реакция анализатора на
ПО, содержащее ошибку синхронизации типа «заброшенные замки»:
ЛИСТИНГ ПРОГРАММЫ
using
Microsoft.Win32;System;System.Collections.Generic;System.IO;System.Linq;System.Text;System.Text.RegularExpressions;System.Threading.Tasks;System.Windows;System.Windows.Controls;System.Windows.Data;System.Windows.Documents;System.Windows.Input;System.Windows.Media;System.Windows.Media.Imaging;System.Windows.Navigation;System.Windows.Shapes;Analyzator
{
///
<summary>
///
Логика взаимодействия для
MainWindow.xaml
///
</summary>partial class MainWindow: Window
{<string>
content = new LinkedList<string>();mutexLock = new
Regex(@"[\._]lock[\(\)]");unlockMutex = new
Regex(@"[\._]unlock[\(\)]");variableRegex = new
Regex(@"^\s*(extern\s+)?(unsigned|signed)?\s*(const\s+)?(int|short|char|long|double|float|byte).*(;)");parser
= new Parser();<Variable> allVariables = new
List<Variable>();linesNumber = 0;leftMutexes = 0;void OpenFile()
{openFileDialog
= new OpenFileDialog();.Multiselect = true;(openFileDialog.ShowDialog() ==
true)
{TextBox.Document.Blocks.Clear();.Clear();(allVariables.Count
> 0) {.Clear();
}
[]
safeFileNames = openFileDialog.SafeFileNames;index = 0;<Variable>
variables = new List<Variable>();(string fileName in
openFileDialog.FileNames)
{
//file1TextBox.AppendText(file);(File.Exists(fileName))
{
/*file1TextBox.AppendText("-----------------------------------");TextBox.AppendText(Environment.NewLine);*/saveFileName
= safeFileNames[index++];TextBox.AppendText("Файл:
" +
saveFileName);TextBox.AppendText(Environment.NewLine);TextBox.AppendText("----------------------------");TextBox.AppendText(Environment.NewLine);=
1;[] lines = File.ReadAllLines(fileName);(string line in lines)
{TextBox.AppendText(linesNumber
+ ". " + line + Environment.NewLine);++;
}TextBox.AppendText(Environment.NewLine);.ReadFile(fileName,
saveFileName);= parser.getVariables();(Variable variable in variables)
{.Add(variable);
}
//searchMutexes(lines);(mutexesCheckBox.IsChecked
== true)
{(lines,
saveFileName);
}
}
}
}(racesCheckBox.IsChecked
== true)
{();
}(racesCheckBox.IsChecked
== false && mutexesCheckBox.IsChecked == false)
{.AppendText("Ни одная уязвимость не выбрана"
+ Environment.NewLine);
}
}MainWindow()
{();TextBox.IsReadOnly
= true;.IsReadOnly = true;
}void
MenuItem_Click(object sender, RoutedEventArgs e)
{();
}void
parseArray(string[] arr)
{lockMatch
= null;unlockMatch = null;(content.Count > 0)
{.Clear();
}lineNumber
= 1;= 0;(string str in arr)
{=
mutexLock.Match(str);= unlockMutex.Match(str);(lockMatch.Success)
{++;.AddLast(lineNumber
+ "." + str.Trim() + "
возможно заброшенный замок");
}
else if (unlockMatch.Success)
{-;
}++;
}
}void
writeToTextBox(string fileName)
{(string
str in content)
{.AppendText(fileName
+ " " + str + Environment.NewLine);
}
}void
printNoLeftMutex(string fileName)
{.AppendText("Заброшенных мьютексов в файле
" + fileName + " не найдено" + Environment.NewLine);
}void
searchRaces()
{(int
i = 0; i < allVariables.Count - 1; i++)
{<string>
sameVariables = new List<string>();.Add(allVariables[i].fullName);(int j
= i + 1; j < allVariables.Count; j++)
{(allVariables[i].name
== allVariables[j].name)
{.Add(allVariables[j].fullName);
}
}(sameVariables.Count
> 1)
{(string
str in sameVariables)
{.AppendText(str
+ " - использование одинакового имени переменной, возможны гонки" +
Environment.NewLine);
}
}
}
}void
searchMutexes(string [] arr, string saveFileName)
{(arr);(leftMutexes
> 0)
{(saveFileName);
}
else
{(saveFileName);
}
}void
MenuItem_Click_1(object sender, RoutedEventArgs e)
{;
}
{name
= saveFileDialog1.FileName;saveFileName = saveFileDialog1.SafeFileName;
//
Write to the file name selected.
//...
You can write the text from a TextBox instead of a string
literal..IO.File.WriteAllText(name, logTextBox.Text);.Show("Файл
" + saveFileName + " был успешно сохранен");
}
}void
MenuItem_Click_2(object sender, RoutedEventArgs e)
{.Current.Shutdown();
}
}
}
ВЫВОД
Ввиду значительной сложности
многопоточного программирования и крайней трудоемкости поиска «плавающих
ошибок» при разработке многопоточного ПО, неизбежно возникает необходимость в
создании программы-анализатора, которая помогала бы отлавливать характерные
ошибки синхронизации.
В процессе создания такой
программы, были изучены механизмы появления таких ошибок синхронизации, как
«гонки» и «заброшенные замки», а также эффективные способы их обнаружения.
СПИСОК ЛИТЕРАТУРЫ
1. Форстер Дж., Лю В. Разработка средств
безопасности и эксплойтов/Пер. с англ. - М.: Издательство «Русская Редакция»;
СПб.: Питер,2007. -432 стр.
. Майкл Ховард, Девид Лебланк, Джон Виега
«Уязвимости в программном коде и борьба с ними». -М.: ДМК Пресс 2011, 288.
. Эндрюс Г.Р. Основы многопоточного,
параллельного и распределенного программирования.: Пер.с англ. - М.:
Издательский дом "Вильямс", 2003. - 512 c.
4. Информационно-аналитические
материалы по параллельным вычислениям (http://www.parallel.ru,
http://www.ccas.ru, www.mcs.anl.gov <http://www.mcs.anl.gov>).
. Немнюгин
С.А., Стесик О.Л. Параллельное программирование для многопроцессорных
вычислительных систем. -СПб.: Петербург, 2002.
. https://ru.wikipedia.org/