Міністерство освіти і науки, молоді та спорту України
Національний університет «Львівська політехніка»
Кафедра АСУ
Лабораторна робота №5
з дисципліни: «Управління ІТ-проектами»
на тему: «Інструменти аналізу коду програмного забезпечення»
Мета роботи: навчитися аналізувати код програмного забезпечення на відповідність рекоментаціям по проектуванні бібліотек; ознайомитися з інструментами для динамічного і статичного аналізу коду.
ЗАВДАННЯ ДО ЛАБОРАТОРНОЇ РОБОТИ
- Розробити документ CodeConvention для аплікації і привести код до даного стандарту.
- Вивчити і застосувати одну з утиліт для статичного аналізу коду (Fxcop, ReSharper, Blastі ін.).
- Вивчити і застосувати одну з утиліт для динамічного аналізу коду (Valgrind, Dmalloc, Dynlnst і ін.).
Зміст
1. CodeConvention
2. Статичний аналіз (для С++ коду)
2.1. Утиліта Cppcheck
3. Динамічний аналіз
3.1. Утиліта Valgrind
1. CodeConvention
Стандарт оформлення коду (coding convention) - набір правил і угод, використовуваних при написанні вихідного коду на деякій мові програмування. Наявність загального стилю програмування полегшує розуміння і підтримку вихідного коду, написаного більш ніж одним програмістом, а також спрощує взаємодію кількох людей при розробці програмного забезпечення.
Стандарт оформлення коду зазвичай приймається і використовується деякою групою розробників програмного забезпечення для однакового оформлення спільно використовуваного коду. Метою прийняття і використання стандарту є спрощення сприйняття програмного коду людиною, мінімізація навантаження на пам'ять і зір при читанні програми.
1) Ім’я файлу має говорити про те, що саме це за файл. Тобто імена файлів мають бути
такими, щоб по них було чітко зрозуміло, що у тих файлах. Наприклад ім’я
email_addresses.txt дозволяє зрозуміти, що у файлі розміщено адреси електронної
пошти.
2) Імена змінних також повинні бути такими, що пояснюють їх призначення
(trainer).
3) Структури повинні відкриватися і закриватися на одному рівні (після та перед
фігурними дужками робимо пробіли):
Викоритстовуємо цей варіант:
if (запис)
{
код всередині;
}
else
{
код всередині;
код інших структур;
}
4) Для називання функцій застосовуємо так звану “верблюдячу нотацію”. Це
коли кожне слово, окрім першого, у імені функції пишеться з великої букви:
openMyFile();
5) На початку кожного файлу та перед функцією пишемо коментарі у такому
форматі:
/**
*якийсь коментар
*/
6) Рекомендується ставити // перед або після коду, що коментуєте.
// якийсь коментар
7) Усі реалізації функцій повинні знаходитися у файлах вихідного коду:
class MyClass
{
public:
int getValue () {return value_;} // Не можна!
...
private:
int value_;
}
Заголовки оголошують інтерфейс, файли вихідного коду його реалізовують. Якщо програмісту необхідно знайти реалізацію, він повинен бути впевнений, що знайде її саме у файлі вихідного коду.
8) Класи завжди називаються з великої букви.
9) Завжди використовуємо пробіли (перед і після оператора) при оформленні логічних і арифметичних виразів.
10) Використовуємо 4 пробіли на один рівень відступу. Не використовуємо табуляції.
11) Змінні, класи, функції називаємо тільки «горбатим регістром» (int someDataHere;)
12) Іменовані константи (включно зі значеннями перерахувань) повинні бути записані у верхньому регістрі з нижнім підкресленням як роздільник.
MAX_ITERATIONS, COLOR_RED
2. Статичний аналіз (для C++ коду)
Статичний аналіз коду - аналіз програмного забезпечення, зроблений (на відміну від динамічного аналізу) без реального виконання досліджуваних програм. У більшості випадків аналіз проводитьсянад якою-небудь версією вихідного коду, хоча іноді аналізу піддається якій небудь вид об'єктного коду, наприклад P-код або код на MSIL. Термін зазвичай застосовують до аналізу, виробленому спеціальним програмним забезпеченням.
Cppcheck - це інструмент статичного аналізу вихідного коду на мові Сі і Сі ++. Відмінними рисами інструменту є: відкритість, безкоштовність, кросплатформенність, простота використання.
Cppcheck версії 1.60.1 підтримує наступні стандарти мови с++: C89, C99, C11, C ++ 03, C ++ 11.
Існують наступні плагіни для інтеграції з різними середовищами розробки:
Code::Blocks - integrated
CodeLite - integrated
Eclipse - Cppcheclipse
gedit - gedit plugin
Hudson - Cppcheck Plugin
Jenkins - Cppcheck Plugin
Tortoise SVN - Adding a pre-commit hook script
Mercurial (Linux) - Adding a pre-commit hook script
Visual Studio / Eclipse - Visual Lint by RiverBlade (платне рішення)
Cppcheck є відкритим, безкоштовним інструментом, поширюваним під ліцензією GNU General Public License. Організатором проекту є Daniel Marjamäki.
Аналізатор Cppcheck виконує безліч різних видів перевірок. Перерахуємо деякі з них:
Неправильне використання функцій з Standard Template Library;
Витоку пам'яті (Memory leaks);
Витоку ресурсів (Resource leaks);
Вихід за межі масивів (Bounds checking for array overruns);
Використання неініціалізованих змінних;
Використання застарілих функцій Перевірка операцій введення / виводу (Check input / output operations);
Розіменування нульового покажчика.
2.1. Утиліта Cppcheck
Вибір проекту, що буде піддаватись статичному аналізу:
/
Результат аналізу:
/
3. Динамічний аналіз
Динамічний аналіз коду - аналіз програмного забезпечення, що виконується за допомогою виконання програм на реальному або віртуальному процесорі (на відміну від статичного аналізу). Утиліти динамічного аналізу можуть вимагати завантаження спеціальних бібліотек, перекомпіляцію програмного коду. Деякі утиліти можуть інструментований виконуваний код в процесі виконання або перед ним. Для більшої ефективності динамічного аналізу потрібно подача тестируемой програмі достатньої кількості вхідних даних, щоб отримати більш повне покриття коду. Також потрібно подбати про мінімізацію впливу інструментірованія на виконання програми, що тестується (включаючи тимчасові характеристики).
3.1. Утиліта Valgrind
Valgrind, виконує програму на віртуальному процесорі, може виявляти помилки пам'яті (наприклад, пов'язані з невірним використанням функцій Танос безкоштовно), ситуації гонки потоків (умови гонки) в багатопоточних програмах
Valgrind добре відомий як потужний засіб пошуку помилок роботи з пам'яттю. Але крім цього, в його складі є додаткові утиліти, призначені для профілювання програм, аналізу споживання пам'яті та пошуку помилок пов'язаних із синхронізацією в багатопоточних програмах.
Valgrind має модульну архітектуру, і складається з ядра, яке виконує емуляцію процесора, а конкретні модулі виконують збір та аналіз інформації, отриманої під час виконання коду на емуляторі. Valgrind працює під управлінням ОС Linux на процесорах x86, amd64, ppc32 і ppc64 (варто відзначити, що ведуться роботи по перенесенню Valgrind і на інші ОС), при цьому існують деякі обмеження, які потенційно можуть вплинути на роботу досліджуваних програм
У постачання valgrind входять наступні модулі-аналізатори:
Memcheck - основний модуль, що забезпечує виявлення витоків пам'яті, та інших помилок, пов'язаних з неправильною роботою з областями пам'яті - читанням або записом за межами виділених регіонів і т.п.
Cachegrind - аналізує виконання коду, збираючи дані про (не) попаданнях в кеш, і точках переходу (коли процесор неправильно пророкує розгалуження). Ця статистика збирається для всієї програми, окремих функцій і рядків коду
Callgrind - аналізує виклики функцій, використовуючи приблизно ту ж методику, що і модуль cachegrind. Дозволяє побудувати дерево викликів функцій, і відповідно, проаналізувати вузькі місця в роботі програми.
Massi - дозволяє проаналізувати виділення пам'яті різними частинами програми
Helgrind - аналізує виконуваний код на наявність різних помилок синхронізації, при використанні многопоточного коду, що використовує POSIX Threads.
Є ще деяка кількість модулів, але вони вважаються експериментальними і не відрізняються особливою стабільністю. Крім того, користувач може створювати свої модулі, що виконують аналіз виконуваного коду.
Результат аналізу:
/
Висновок: на даній роботі я ознайомився засобами для статичного (Cppcheck) та динамічного (Valgrind) аналізу програм на мові С++. Також був розроблений CodeConvention документ для розроблюваної програми.