почему ulimit -v не работает под дезинфицирующим средством clang's address? - PullRequest
0 голосов
/ 24 октября 2018

Я использую 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",
],

, но это немедленно вызывает ошибку.

1 Ответ

0 голосов
/ 24 октября 2018

Асан резервирует 1/8 адресного пространства процесса для теневой памяти при запуске для хранения состояния пользовательских данных (выделено, освобождено и т. Д.).Это сделано специально, и с этим никто ничего не может поделать.

Обратите внимание, что вы обычно не заботитесь о виртуальной памяти, а скорее о физической (что также приводит к сбою new в вашем случае).

...