【问题标题】:How to stop using AddressSanitizer?如何停止使用 AddressSanitizer?
【发布时间】:2021-02-14 14:16:35
【问题描述】:

我将在这里受到打击,因为我正在使用我不完全理解并且没有花时间这样做的工具。此时我只想快速从我的工作中删除不必要的步骤/依赖项。

我在开发过程中使用AddressSanitizer 在我的 C 代码中查找段错误和其他问题的原因。为此,我将 -fsanitize=address 添加到 Makefile 中的 CFLAGS 列表中。

现在,在解决了所有此类问题后,如果我从编译中删除此标志,我将无法再编译我的代码,并且会出现许多与此问题中描述的错误非常相似的错误...

How to use AddressSanitizer with GCC?

~/xxx/util.c:20: 未定义引用__asan_option_detect_stack_use_after_return' /usr/bin/ld: ~/xxx/util.c:20: undefined reference to __asan_stack_malloc_2' usr/bin/ld: /xxx/util.c:23: 未定义引用__asan_report_store8' /usr/bin/ld: /xxx/util.c:40: undefined reference to __asan_report_load8' /usr/bin/ld: /xxx/util.c:45:未定义的引用 到 `__asan_report_load8' /usr/bin/ld: 以此类推。

不同的是我只想正常编译我的代码。在那个问题中,他们建议在链接/编译步骤中添加一个标志 -lasan。这似乎不会帮助我停止使用-fsanitize,尽管我可能是错的。显然,这里的链接步骤有问题。感觉好像我在某个地方包含了一个我忘记的依赖项,但我不记得这样做了。

我错过了什么?可能是显而易见的事情。另外,如果我需要提供有关我的编译步骤的更多信息,请告诉我。

【问题讨论】:

    标签: c gcc address-sanitizer


    【解决方案1】:

    问题很简单:要使其工作,-fsanitize=address 必须存在于 编译 链接命令行中。要禁用它,它不能在任何一个中使用。

    您的构建目录中必须有旧的.o 目标文件。一种解决方案是使用make clean 删除中间文件或目标文件。

    如果您没有clean 目标,现在是编写它的好时机...或者使用类似find -name '*.o' -deleterm **/*.o 如果有幸使用ZSH。

    【讨论】:

    • 在我看来,Brian 是时候开始使用像 cmake 这样的工具了,99.999% 的时间会自动处理此类问题(即 cmake 将标志复制到两者根据需要放置,它会在必要时重建目标,并为您提供免费的clean 目标...)
    【解决方案2】:

    我只想正常编译我的代码

    删除-fsanitize=... 标志应该这样做。

    您的问题很可能源于没有重建所有对象(当您更新 Makefile 时,make 不会自动知道要重建所有对象)。

    运行 make clean; makefind . -name '*.o' | xargs rm; make 应该可以解决问题。

    【讨论】:

    • 请注意,可以设置 Makefile 以便在 Makefile 更改时重建所有内容(OP 显然没有这样做)
    猜你喜欢
    • 2014-05-06
    • 2016-10-24
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2017-01-26
    • 2020-05-12
    相关资源
    最近更新 更多