Отладка, assert и тестирование
Отладчик
Отладчик позволяет остановить программу на breakpoint, пошагово выполнять код, смотреть значения переменных и стек вызовов. Когда программа работает не так, как ожидается, сначала воспроизведи проблему минимальным примером и проверь фактические значения, а не делай вывод только по внешнему проявлению.
assert
assert из <cassert> проверяет предположение программиста:
#include <cassert>int DividePositive(int a, int b) { assert(b > 0); return a / b;}В сборках с NDEBUG проверки assert отключаются. Поэтому не используй их для обязательной проверки пользовательского ввода или других ошибок, которые должны обрабатываться в релизе.
Маленькие функции проще проверять
Функция, которая получает входные данные и возвращает результат без скрытых побочных эффектов, обычно легче тестируется. Например, int Add(int, int) проще проверить, чем код, который одновременно читает консоль, изменяет глобальное состояние и пишет файл.
Unit-тесты
Модульный тест проверяет небольшую единицу поведения. Набор тестов должен включать обычные случаи, границы и ошибочные входы.
Для функции, которая обрабатывает диапазон, проверь пустой диапазон, один элемент, минимум и максимум. Для парсера проверь пустой ввод и неверный формат.
Sanitizers
Компиляторы GCC и Clang поддерживают санитайзеры, помогающие обнаруживать некоторые ошибки времени выполнения, например выход за границы и use-after-free. Например, в подходящей конфигурации можно включить -fsanitize=address,undefined. Поддержка зависит от компилятора и платформы.
Итог
Используй отладчик для исследования состояния, тесты — для закрепления ожидаемого поведения, а санитайзеры — для поиска некоторых классов ошибок памяти и неопределённого поведения.
