gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:56:43 29 4
gpt4 key购买 nike

我遇到了一个错误无法始终重现,其中 free()在无效的堆指针上调用。对于有问题的代码,根本不可能将此问题减少到“最小”——(一旦我这样做了,它就解决了)。我无法发现任何明显的问题(例如从未调用 calloc 的潜在情况,或双重释放等...)

我相信valgrind将是解决此问题的方法,但性能影响将过于极端(这些是客户端->服务器调用超时,以及开始时成本高昂的操作...>在某些情况下为 4 秒)

这给我留下了 fsanitize=address , 我相信?到目前为止,我在这方面的经验……不是很好。

我得到的是两个静态库和一个与它们链接的可执行文件。我打开了 fsanitize=address对于他们三个。与 -fsanitize=address ,在非常经过彻底测试和正确的初始化例程(在 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",

最佳答案

我将把它留在这里,以供将来遇到 fsanitize 问题的搜索者使用。 tldr;--成功了。我有两个基本问题:

  1. fsanitize 正在输出有关其退出原因的完整错误信息。这被 nginx 吞没了......并且在我们的定制版本中它被重定向到一个晦涩的日志文件。不知道为什么在 gdb 下我没有得到调试中断,但是......它检测到一个合法错误。此处的关键信息:在 __asan_report_error 中设置断点将在退出前停止程序,以便您可以检查各种帧。

  2. 虽然初始化例程是正确的并且经过严格测试,但正如我提到的那样,它确实需要其客户端正确分配(非平凡的)配置结构。在这种情况下,结构缺少 1 个字节,导致 1 个字节过读。

关于c++ - 使用 gcc 进行 fsanitize 导致意外提前退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52377149/

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