1.3Kпросмотров
29 ноября 2025 г.
Score: 1.4K
Естественно, стало интересно, как именно генерят данные на вход. И вот что в целом там происходит:
1. Методы для фаззинга не переизобретали, а просто используют стороннюю либу libfuzzer, а также свой генератор псевдослучайных чисел PCG
2. Жизненный цикл fuzz‑итерации выглядит примерно так:
- из seed corpus выбирается случайный элемент (seed input)
- передаётся в mutate(), где изменяется случайными операциями
- новый инпут передаётся в наш fuzz target - если этот мутированный инпут даёт новое покрытие (т.е. приводит к выполнению веток, которые ранее не проходили), он добавляется в seed corpus как interesting (видно в логах).
3. Мутация целых чисел в основном крутится вокруг сложения/вычитания, но с проверками, чтобы итог входил в диапазон значений своего типа (решили на отдаваться судьбе с mod от переполнения). Если лень смотреть сорсы - тут разбор
Причем одно и то же число не может быть увеличено или уменьшено на 100+ значений (есть прямо прописан лимит). Для строк, например, на каждой итерации алгоритм выбирает случайную операцию из списка
4. Фаззер ограничен общим количеством байт (maxBytes) на один вход. Так как мутация может сильно увеличить каждое поле и нельзя этого допустить
5. Fuzz‑target может принимать только примитивные типы, ну и []byte тоже может, а остальные слайсы, структуры и тд не поддерживает, поэтому стоит упаковывать вручную P.S. Я не спец по фаззинг тестированиям, но кажется, для покрытия мелких методов это должно помочь найти всякие edge кейсы