Неможливо бути абсолютно впевненим, що різні види невизначеної поведінки (зокрема, умови перегонів) не існують.
Однак існує ряд інструментів, які відображають велику кількість таких ситуацій. Можливо, ви зможете довести, що в даний час існує проблема з такими інструментами, навіть якщо ви не можете довести, що ваше виправлення є дійсним.
Деякі цікаві інструменти для цієї мети:
Valgrind - це перевірка пам'яті. Він знаходить витоки пам’яті, зчитує неініціалізовану пам’ять, використовує звисаючі покажчики та вихід за межі поля.
Helgrind - це перевірка безпеки потоку. Він знаходить умови перегонів.
Обидва працюють за допомогою динамічного інструментарію, тобто вони приймають вашу програму як таку і виконують її у віртуалізованому середовищі. Це робить їх не нав'язливими, але повільними.
UBSan - це не визначена перевірка поведінки. Він виявляє різні випадки C і C ++ невизначеної поведінки, такі як цілі переливи, виїзди за межі діапазону тощо.
MSan - перевірка пам'яті. Він має подібні цілі, як і Вальгрінд.
TSan - перевірка безпеки потоку. Він має подібні цілі, як Гелгринд.
Ці три вбудовані в компілятор Clang і генерують код під час компіляції. Це означає, що вам потрібно інтегрувати їх у свій процес збирання (зокрема, вам потрібно компілювати з Clang), що робить їх набагато складніше спочатку налаштувати, ніж * шліфувати, але з іншого боку, вони мають значно менші витрати на виконання.
Усі перелічені я інструменти працюють в Linux, а деякі з них - на MacOS. Я не думаю, що будь-яка робота в Windows ще надійно.