Які помилки можуть викликати падіння програми, написаної на C
У вас є вихідний код програми, яка аварійно завершується після запуску. Після десяти запусків у відладчику ви виявляєте, що щоразу програма падає у різних місцях. Додаток однопоточний і використовує лише стандартну бібліотеку С. Які помилки можуть спричинити падіння програми? Як ви перевірите кожну?
Питання значною мірою залежить від типу програми, що діагностується. Однак, ми можемо навести деякі загальні причини випадкових відмов.
- "Випадкова" змінна: програма може використовувати деяке "випадкове" значення або змінну-компонент, яка не має конкретного точного значення. Приклади: введення даних користувачем, випадкове число, згенероване програмою, час і т.д.
- Неініціалізована змінна: програма може використовувати неініціалізовану змінну, яка в деяких мовах програмування за умовчанням може набувати будь-якого значення. Таким чином, код може кожен раз виконується по-різному.
- Витік пам'яті: програма, можливо, вичерпала всі ресурси. Інші причини носять випадковий характер і залежить від кількості запущених у час процесів. Сюди можна віднести переповнення купи чи пошкодження даних у стеку.
- Зовнішні причини: програма може залежати від іншої програми, машини чи ресурсу. Якщо таких зв'язків багато, програма може «впасти» будь-якої миті.
Щоб знайти проблему, потрібно максимально вивчити програму. Хто його запускає? Що роблять користувачі? Що робить сам додаток?
Хоча програма падає не в якомусь конкретному місці, можливо, саме падіння пов'язане з конкретними компонентами чи сценаріями. Наприклад, програма може залишатися працездатною в момент запуску, а збій відбувається тільки післязавантаження файлу. Або ж збій відбувається в зоні відповідальності компонентів низького рівня, наприклад, при файловому вводі-виводі.
Можна виконувати вибіркове тестування. Закрийте всі інші програми. Дуже уважно відстежуйте усі вільні ресурси. Якщо можна відключити частини програми, зробіть це. Запустіть програму на іншій машині і подивіться, чи ця помилка виникне. Що більше ми можемо змінити, то легше знайти проблему.
Крім того, можна використовувати спеціальні інструменти для перевірки специфічних ситуацій. Наприклад, щоб дослідити причину появи помилок 2-го типу, можна використовувати налагоджувачі, які перевіряють неініціалізовані змінні. Подібні завдання дозволяють продемонструвати не тільки розумові здібності, але і стиль вашої роботи. Ви постійно перескакуєте з одного на інше та висуваєте випадкові припущення? Чи ви підходите до вирішення задачі логічно? Хотілося б сподіватись на останнє.