Перейти к содержимому
8 / 15

Фаззинг в Go: как писать и что он находит

Фаззинг встроен в тулчейн начиная с Go 1.18. Функция FuzzXxx(f *testing.F) объявляет корпус затравок через f.Add и целевую функцию через f.Fuzz; движок мутирует затравки, отслеживая покрытие кода, и ищет вход, на котором цель падает. Находит он ровно то, что человек не додумается написать в табличном тесте: панику на пустом или обрезанном вводе, выход за границы среза, переполнение при разборе чисел, зацикливание, ошибки декодирования на некорректном UTF-8. Особенно ценна проверка свойств вместо значений: например, что Decode(Encode(x)) равно x для любого x, — такое утверждение фаззер проверяет на миллионах входов. Найденный сбойный вход автоматически сохраняется в testdata/fuzz/ и становится обычным тестовым случаем, воспроизводящимся при каждом go test. Практическая особенность: без флага -fuzz функция выполняется как обычный тест на корпусе затравок — то есть в CI она работает всегда, а собственно фаззинг запускают отдельно и по времени.