我是否应该关心ASAN报告的Rust可执行文件中的单定义规则冲突?

我是否应该关心ASAN报告的Rust可执行文件中的单定义规则冲突?,rust,one-definition-rule,Rust,One Definition Rule,我有一个纯粹在Rust生态系统中编译的Rust可执行文件;没有外部C代码或链接库,没有编译器拖入的任何内容 在Linux上使用ASAN编译后,ASAN报告了一个单定义规则(ODR)冲突。我应该担心可执行文件的正确性吗?有哪些共同的担忧?什么是角落里的箱子 我的理解是,因为我所有的Rust依赖项都被编译成.rlibs,因为我的代码都不是外语,也因为我的代码都没有显式引用外国库,所以编译器在编译时应该知道我程序的所有符号名,除了可能的例外,系统库是它自己拖动的,因此应该知道。因此,我倾向于忽略ODR

我有一个纯粹在Rust生态系统中编译的Rust可执行文件;没有外部C代码或链接库,没有编译器拖入的任何内容

在Linux上使用ASAN编译后,ASAN报告了一个单定义规则(ODR)冲突。我应该担心可执行文件的正确性吗?有哪些共同的担忧?什么是角落里的箱子

我的理解是,因为我所有的Rust依赖项都被编译成
.rlib
s,因为我的代码都不是外语,也因为我的代码都没有显式引用外国库,所以编译器在编译时应该知道我程序的所有符号名,除了可能的例外,系统库是它自己拖动的,因此应该知道。因此,我倾向于忽略ODR违规,因为“对此我无能为力”

目前,我无法提供一个关于这一点的最简单的复制示例,只需要一个足够让我确定我是否应该关注调查的答案

我使用ASAN生成/运行的命令:

CARGO_INCREMENTAL=0 RUSTFLAGS="-Z sanitizer=address" cargo run --target x86_64-unknown-linux-gnu --example name_of_example
错误消息(删除了可执行文件名和文件路径)

==18003==错误:AddressSanitizer:odr冲突(0x5625fb39f760):
[1] 大小=0“参考c”可执行文件\u名称\u此处12-d0d02bd82d5d1b2688ff68a1707ea7a1.rs
[2] 大小=0“参考l”可执行文件\u名称\u此处10-d0d02bd82d5d1b2688ff68a1707ea7a1.rs
这些globals是在以下几点注册的:
[1]:
#0 0x5625fb2a5727 in u asan_register_globals.part.11/checkout/src/libcompiler_builtins/compiler rt/lib/asan/asan_globals.cc:338
#asan.module_ctor中的1 0x5625faf4e26d(/executable/path/here+0x1c326d)
[2]:
#0 0x5625fb2a5727 in u asan_register_globals.part.11/checkout/src/libcompiler_builtins/compiler rt/lib/asan/asan_globals.cc:338
#asan.module_ctor中有1个0x5625fae9d9cd(/executable/path/here+0x1129cd)

据我所知,这不是来自我的板条箱(我没有观察到不良行为,因此我倾向于不关心),但我有多个相互依存的板条箱在这里安装了仪器,不确定这是否反映了更险恶的潜在问题。

你能解释一下ASAN报告的是哪个符号吗?这是不是你箱子里的一个符号?它是一个静态值还是一个函数。。。你的问题目前缺乏细节:x@MatthieuM. 哦,是的,这很重要,不是吗?一个定义规则是C和C++的规则。在Rust可执行文件上运行检查对我来说没有意义。@SebastianRedl如果我理解得很好,这就是OP的问题:“这个概念在Rust中有意义吗,为什么?”。您应该在回答中详细说明您的评论。@Boiethios我不想回答,因为我不知道odr检查器实际上做了什么,这使它认为Rust程序包含违规行为。文件中没有明确的机制。