В повседневной разработке мы часто пишем варианты использования, соответствующие тестиизтесту. Часто ли у вас возникают следующие сомнения:
На этот раз всем рекомендую go-fuzz Возможно, это позволит поднять надежность вашего проекта на более высокий уровень и более или менее облегчить ваши проблемы. go-fuzzда Dmitry Vyukov Великий бог был там долгое время go1.5 Times с открытым исходным кодом (Apache License 2.0 лицензия с открытым исходным кодом) golang Инструменты нечеткого тестирования предоставляют мощные методы проверки надежности систем, которые анализируют сложные входные данные (текстовые или двоичные). Пока что, иди-фузз Уже для go Язык (вы правильно прочитали, это golang сам)и Некоторые сторонние библиотеки обнаружилисотни дефектов,Можно сказать, что он пользуется большим авторитетом!
Википедия объясняет нечеткое тестирование следующим образом:
Фазз-тестирование (фаззинг) — это технология тестирования программного обеспечения. Основная идея состоит в том, чтобы вводить автоматически или полуавтоматически сгенерированные случайные данные в программу и отслеживать исключения программы, такие как сбои и сбои утверждений, для обнаружения возможных ошибок программы, таких как утечки памяти. Нечеткое тестирование часто используется для обнаружения уязвимостей безопасности в программном обеспечении или компьютерных системах.
go-fuzz Автоматически генерируемые тестовые случаи не просто случайны, они сильно зависят от afl(American Fuzzy Lop),Во время выполнения итеративные изменения будут производиться в соответствии с определенными правилами алгоритма, основанными на существующих вариантах использования и выполнении вариантов использования.,таким образом, бесконечный «Деление» Создавайте новые тесты. в настоящий момент gitlab.com и fuzzbuzz.io основаны на go-fuzz из ci интегрированный.
Ниже мы будем использовать http://fuzzbuzz.io Давайте рассмотрим небольшой пример go-fuzz Как использовать. В следующем коде середина есть один довольно неясный момент. ошибка при наборе из Data Точно FUZ Доступ за пределы будет активирован, когда:
package tutorial
// BrokenMethod has a bug - it will try to read the 4th
// index of Data even when it only has a length of 3.
func BrokenMethod(Data string) bool {
return len(Data) >= 3 &&
Data[0] == 'F' &&
Data[1] == 'U' &&
Data[2] == 'Z' &&
Data[3] == 'Z'
}
Далее мы пытаемся использовать go-fuzz для обнаружения уязвимости.
go get -u github.com/dvyukov/go-fuzz/go-fuzz@latest github.com/dvyukov/go-fuzz/go-fuzz-build@latest
Не забудьте добавить $GOPATH/bin в PATH.
добавить в код метод_fuzz.go,Внимание // +build gofuzz дама должна добавить из,Следующий шаг сборки определит его.
// +build gofuzz
package tutorial
func Fuzz(data []byte) int {
BrokenMethod(string(data))
return 0
}
Fuzz код возврата функции настоящий моментиметь 3 необязательные значения: возврат 1 Указывает, что ток входного веса увеличивается и возвращается -1 Указывает, что текущий вход не добавляется в корпус, в противном случае возвращается 0。
Мы добавляем F и FU как BrokenMethod из Два варианта использования. Конечно, если в вашем коде середина уже разработаны варианты использования, вы также можете копировать напрямую. workdir/corpus Вниз.
mkdir -p workdir/corpus
echo -n "F" >workdir/corpus/1
echo -n "FU" >workdir/corpus/2
Добавление начального корпуса не обязательно, но go-fuzz Автор рекомендует чем богаче исходный корпус, тем лучше, что очень полезно для последующего нечеткого исполнения!
go get -d github.com/dvyukov/go-fuzz-corpus
go-fuzz-build
Этот шаг может занять некоторое время,Это связано со сложностью проекта. После успешного выполнения,будет внутри Посмотреть в текущем каталоге tutorial-fuzz.zip из Сжатый пакет.
go-fuzz да go1.5 Я сейчас старый парень, прямо сейчас go module поддержка все еще находится на ранней стадии. Выполнить перед созданием теста go get -d http://github.com/dvyukov/go-fuzz-corpus будет внутри go.mod Добавление строки не требует наличия зависимостей. После выполнения нечеткого теста используйте. go mod tidy можно восстановить.
go-fuzz -bin=tutorial-fuzz.zip -workdir=workdir
В это время мы видим следующий вывод на консоли:
2021/05/16 13:56:45 workers: 4, corpus: 4 (2s ago), crashers: 1, restarts: 1/0, execs: 0 (0/sec), cover: 0, uptime: 3s
2021/05/16 13:56:48 workers: 4, corpus: 4 (5s ago), crashers: 1, restarts: 1/0, execs: 0 (0/sec), cover: 6, uptime: 6s
2021/05/16 13:56:51 workers: 4, corpus: 4 (8s ago), crashers: 1, restarts: 1/408, execs: 48969 (5440/sec), cover: 6, uptime: 9s
...
go-fuzz Выполнение тестов не прекращается автоматически, когда мы обнаруживаем crashers Поле значения не является 0 (когда вариант использования запускает программируемый), вы можете завершить тест и просмотреть результаты теста, в результате чего программируемый вариант использования будет сохранен в workdir/crashers/ в каталоге
$ tree workdir/crashers/
workdir/crashers
├── 0eb8e4ed029b774d80f2b66408203801cb982a60
├── 0eb8e4ed029b774d80f2b66408203801cb982a60.output
└── 0eb8e4ed029b774d80f2b66408203801cb982a60.quoted
Видимый, рабочий каталог/крашеры Слишком 3 файлы, их имена файлов являются вариантами использования входных данных. sha1sum ценить.
$ cat workdir/crashers/0eb8e4ed029b774d80f2b66408203801cb982a60.quoted
"FUZ"
$ cat workdir/crashers/0eb8e4ed029b774d80f2b66408203801cb982a60.output
panic: runtime error: index out of range [3] with length 3
goroutine 1 [running]:
demo.BrokenMethod.func4(...)
/Users/blanet/repos/tmp/tutorial-go/method.go:9
demo.BrokenMethod(0xc000092e80, 0x3, 0x3)
/Users/blanet/repos/tmp/tutorial-go/method.go:10 +0x11d
demo.Fuzz(0x4810000, 0x3, 0x3, 0x3)
/Users/blanet/repos/tmp/tutorial-go/fuzz.go:5 +0x6f
go-fuzz-dep.Main(0xc000092f70, 0x1, 0x1)
go-fuzz-dep/main.go:36 +0x1b8
main.main()
demo/go.fuzz.main/main.go:15 +0x52
exit status 2
До сих пор,Мы нашли программусерединаизлазейки и воспроизводим вариант использования лазейкииз.,После небольшой доработки проблема решилась! лазейки После ремонта,Мы также можем разработать новые тестовые устройства для выявленных плохих случаев.,Дальнейшее улучшение качества кода.
использовать go-fuzz В программу можно интегрировать нечеткий тест, который полезен для определения надежности сложных систем ввода и проверки различных глубоководных участков. panic из сцены очень полезно. Давайте попробуем это сейчас!