gcc 在使用ASan进行构建时,是什么原因导致了多个定义错误?

oug3syen  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(250)

所以我试图在一个大的代码库中识别一些内存损坏问题。我首先构建了代码库,因为它使用了已经设置好的任何现有makefile配置。(如果有什么不同的话,也试过用-lasan)在链接标志中用ASan编译代码库。但是现在我在链接时得到了多个声明错误。我在这一点上毫无头绪。这是什么原因呢?如果有多个定义,那么在没有ASan标志的情况下构建时不也应该弹出同样的错误吗?我甚至在ASan文档中找不到任何与此相关的内容。
我不能分享确切的错误跟踪,但它看起来很像这样:

path/to/file/hdr.h:132: multiple definition of `myDataTable_type'
path/to/file/hdr.h:132: first defined here
path/to/obj/file/obj.o: multiple definition of `__odr_asan.myDataTable_type'

gcc --版本gcc(GCC)8.4.1 20200928(红帽8.4.1-1)

nhaq1z21

nhaq1z211#

很有可能你有这样的东西

XXX myDataTable_type;

在其中一个标头中。当此标头包含在多个源文件中时,您将在-fno-common下得到多个定义错误。
要解决此问题,您可以从CFLAGS中删除-fno-common,但这样Asan将无法检测到某些静态数组中的缓冲区溢出。更好的方法是,通过将头中的声明更改为

extern XXX myDataTable_type;

并添加了

XXX myDataTable_type;

到其中一个源文件(以保证单一定义)。

相关问题