Я использую libFuzzer для фаззинга API.
API десериализует массив битов (предоставленный libFuzzer)
и преобразует их в экземпляры класса c ++.
Благодаря формату сериализации, libFuzer может создавать сериализованный объект, который сообщает десериализатору резервировать большие объемы данных (которые не могут быть выполнены).
Это делается с помощью вызовов std::vector::resize()
.Вектор выбрасывает std::bad_alloc
, и, хотя проблема обнаружена и безопасно устранена, она вызывает чрезвычайную задержку в фаззере (как упомянуто в следующей документации по проблемам OOM).
Inпопытка уменьшить объем памяти, используемой при работе фаззера, я надеялся установить ulimit -v
и настроить доступную виртуальную память процесса.Однако это приводит к
==27609==ERROR: AddressSanitizer failed to allocate 0xdfff0001000 (15392894357504) bytes at address 2008fff7000 (errno: 12)
==27609==ReserveShadowMemoryRange failed while trying to map 0xdfff0001000 bytes. Perhaps you're using ulimit -v
Почему очиститель адресов не может работать в режиме ulmit -v?
Если бы я мог, тогда я мог бы работать более эффективно.
Другая информация:
Мои флаги сборки были:
copts = [
"-fsanitize=address,fuzzer",
"-fsanitize-trap=undefined,integer",
"-fsanitize-coverage=trace-pc,trace-cmp,trace-pc-guard",
"-g",
"-O0",
"-fno-omit-frame-pointer",
"-fno-sanitize=vptr",
],
linkopts = [
"-fsanitize=address,fuzzer",
"-fsanitize-trap=undefined,integer",
"-fno-sanitize=vptr",
"-fsanitize-link-c++-runtime",
],
Я попытался отключить флаги, чтобы установить ulimit
и запустить фаззер:
copts = [
"-fsanitize=fuzzer",
"-g",
"-O0",
"-fno-omit-frame-pointer",
],
linkopts = [
"-fsanitize=fuzzer",
],
, но это немедленно вызывает ошибку.