Справжня відповідь тут така: Ви ніколи не можете точно знати точно.
Принаймні, у нетривіальних випадках ви не можете бути впевнені, що ви все це здобули. Розглянемо наступне зі статті Вікіпедії про недосяжний код :
double x = sqrt(2);
if (x > 5)
{
doStuff();
}
Як правильно зазначає Вікіпедія, розумний компілятор, можливо, зможе зловити щось подібне. Але врахуйте модифікацію:
int y;
cin >> y;
double x = sqrt((double)y);
if (x != 0 && x < 1)
{
doStuff();
}
Чи вловить це компілятор? Можливо. Але для цього потрібно буде більше, ніж sqrt
протистояти постійному скалярному значенню. Доведеться зрозуміти, що (double)y
завжди буде цілим числом (легким), а потім зрозуміти математичний діапазон sqrt
для набору цілих чисел (важко). Дуже складний компілятор може зробити це для sqrt
функції, або для кожної функції в math.h , або для будь-якої функції з фіксованим входом, домен якої може визначити. Це стає дуже, дуже складним, а складність в основному безмежна. Ви можете продовжувати додавати шари вишуканості у ваш компілятор, але завжди знайдеться спосіб прокрастись у якийсь код, який буде недоступний для будь-якого набору входів.
А потім є набори введення, які просто ніколи не вводяться. Вхід, який би не мав сенсу в реальному житті, або заблокований логікою перевірки в іншому місці. Компілятор не може знати про них.
Кінцевим результатом цього є те, що, хоча згадані інші програмні засоби є надзвичайно корисними, ви ніколи не будете точно знати, що все зловили, якщо потім не вручаєте код вручну. Навіть тоді ви ніколи не будете впевнені, що нічого не пропустили.
Єдине справжнє рішення - IMHO - бути максимально пильним, використовувати автоматику, яка є у вашому розпорядженні, рефактор, де ви можете, і постійно шукати шляхи вдосконалення свого коду. Звичайно, це все-таки добре зробити.