使用gcc进行fsanitize导致意外提前退出

问题描述 投票:1回答:1

我有一个错误,在一个无效的堆指针上调用free()时不能始终如一地重现。将问题简化为“最小化”从根本上说不可能使用相关代码 - (一旦我完成了,它就解决了)。我无法发现任何明显的问题(例如从未调用calloc或双重免费等的潜在案例......)

我相信valgrind将是一个解决方案,除了性能影响太极端(这些是超时的客户端 - >服务器调用,以及开始时昂贵的操作...>在某些情况下> 4秒)

这让我留下fsanitize=address,我相信?到目前为止,我的经历是......并不是很好。

我得到的是两个静态库和一个与它们链接的可执行文件。我为他们三个人打开了fsanitize=address。使用-fsanitize=address,代码在一个经过彻底测试和正确的init例程(在256字节的memcpy中间进入16兆的堆分配 - 退出代码1)中在调试器下干净地退出。

任何有使用fsanitize实践经验的人都能为我提供有关问题所在的提示吗?我在cmake下使用gcc / ld,代码是(基本上)用C ++编译的C代码。切换到clang可能是一个选择,如果这可能会改善一些事情。

典型的文件编译命令:

"command": "/usr/bin/c++   -I. -I/home/redacted -fpermissive -g -g3 -fasynchronous-unwind-tables -fsanitize=address   
-std=gnu++11 -o core/CMakeFiles/nginx_core.dir/src/core/nginx.cpp.o -c /home/redacted.cpp",
c++ gcc clang++
1个回答
1
投票

我只是留在这里为未来的搜索者与fsanitize有问题。 tldr; - 它奏效了。我有两个基本问题:

  1. fsanitize正在输出有关其退出原因的详细错误信息。这被nginx吞噬了......在我们的定制版本中,它被重定向到一个不起眼的日志文件。不知道为什么在gdb下我没有得到调试中断,但不过......它正在检测出一个合法的错误。这里的关键信息:在__asan_report_error中设置断点将在退出之前暂停程序,以便您可以检查各种帧。
  2. 虽然初始化例程是正确的并且经过了大量测试,但正如我所提到的,它确实需要其客户端正确地分配(非平凡的)配置结构。在这种情况下,结构完全缺少1个字节,导致1个字节的重写。
© www.soinside.com 2019 - 2024. All rights reserved.