gpt4 book ai didi

c++ - 为什么 ulimit -v 在 clang 的地址 sanitizer 下不起作用?

转载 作者:太空狗 更新时间:2023-10-29 23:10:59 26 4
gpt4 key购买 nike

我正在使用 libFuzzer对 API 进行模糊测试。
API 正在反序列化一个位数组(由 libFuzzer 提供)
并将它们转换为 C++ 类实例化。

由于序列化格式,libFuzer 能够构造一个序列化对象,告诉反序列化器保留大量数据(无法满足)。
这是通过调用 std::vector::resize() 来完成的。 vector 抛出一个 std::bad_alloc,虽然问题被捕获并被安全地缓解,但它会导致模糊器中的极度延迟(如 following documentation 中关于 OOM 问题所述)。

为了降低模糊器运行时使用的内存量,我希望设置 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",
],

但这会立即导致段错误。

最佳答案

Asan 在启动时为影子内存保留 1/8 的进程地址空间以保存用户数据的状态(已分配、已释放等)。这是设计使然,对此我们无能为力。

请注意,您通常不关心虚拟内存,而是关心物理内存(这也会导致 new 在您的情况下失败)。

关于c++ - 为什么 ulimit -v 在 clang 的地址 sanitizer 下不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52970994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com