c++ - 为什么 ulimit -v 在 clang 的地址清理程序下不起作用?
问题描述
我正在使用libFuzzer对 API 进行模糊测试。
API 正在反序列化一个位数组(由 libFuzzer 提供)
并将它们转换为 c++ 类实例化。
由于序列化格式,libFuzer 能够构造一个序列化对象,告诉反序列化器保留大量数据(无法满足)。
这是通过调用来完成的std::vector::resize()
。向量抛出 a std::bad_alloc
,尽管问题已被捕获并安全缓解,但它会导致模糊器极度滞后(如以下有关 OOM 问题的文档中所述)。
为了降低 fuzzer 运行时使用的内存量,我希望设置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
在您的情况下这也会导致失败)。
推荐阅读
- jolt - 规范中的 JOLT 变换数组索引问题
- c - C 解析器程序添加/sub/div/mul。从用户读取输入想要以分号终止我的程序,而不是按回车键
- node.js - 使用 bash/shell 脚本重新启动节点 js 服务器
- ms-access - 如何从 Access 复制粘贴“设计视图”到 excel?
- java - 将 SQLite 游标中的所有行列获取到一个对象中
- r - r 转换为 json,需要值 null 不被引用
- javascript - Three.js:远处物体微弱
- powershell - PowerShell 错误包含完整的 SOAP 响应而不是内容
- c++ - 将 std::variant 转换为具有子集类型的另一个 std::variant
- wordpress - 这个 docker-compose.yml 文件启动 traefix、wordpress 和 mariadb 容器有什么问题?