Переповнення буфера: причини, ефективні методи вирішення проблеми і необхідний захист

Небезпеки в C/C++

Користувачі C повинні уникати застосування небезпечних функцій, які не перевіряють кордону, якщо вони не впевнені, що кордони не будуть перевищені. Функції, яких слід уникати в більшості випадків, щоб забезпечити захист, включають функції strcpy. Їх слід замінити такими функціями, як strncpy. Слід уникати використання функції strlen, якщо користувач впевнений, що буде знайдений завершальний символ NIL. Сімейство scanf (): scanf (3), fscanf (3), sscanf (3), vscanf (3), vsscanf (3) і vfscanf (3) – небезпечно для використання, його не застосовують для відправки даних в рядок без контролю максимальної довжини, “формат% s” є особливо поширеним збоєм.

Офіційно snprintf () не є стандартною функцією C класифікації ISO 1990. Ці системи не захищають від переповнення буфера, вони просто викликають sprintf безпосередньо. Відомо, що поточна версія Linux snprintf працює правильно, тобто фактично дотримується встановлену межу. Обчислене значення snprintf () також змінюється.

Версія 2 специфікації Unix (SUS) і стандарт C99 відрізняються тим, що повертає snprintf (). Деякі версії snprintf don’t гарантують, що рядок закінчиться в NIL, а якщо рядок занадто довга, вона взагалі не буде містити NIL. Бібліотека glib має g_snprintf () з послідовною семантикою повернення, завжди закінчується NIL і, що найбільш важливо, завжди враховує довжину буфера.