首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用GCC未定义的行为消毒剂

使用GCC未定义的行为消毒剂
EN

Stack Overflow用户
提问于 2015-08-04 07:57:09
回答 2查看 14.2K关注 0票数 25

今天我在文章上读到了关于,GCC,行为消毒剂(ubsan)的文章。但是,当我按照步骤(将-fsanitize=undefined添加到我的代码)时,编译器(Ubuntu15.04上的GCC 4.9.2 )说有些引用没有定义:

代码语言:javascript
运行
复制
||=== Build: Debug in Project (compiler: GNU GCC Compiler) ===|
obj/Debug/App.o||In function `App::OnInit()':|
/home/ilya/Project/App.cpp|31|undefined reference to `__ubsan_handle_type_mismatch'|
/home/ilya/Project/App.cpp|31|undefined reference to `__ubsan_handle_load_invalid_value'|
...
obj/Debug/App.o||In function `wxObjectEventFunctor::operator()(wxEvtHandler*, wxEvent&)':|
/usr/include/wx-3.0/wx/event.h|3757|undefined reference to `__ubsan_handle_add_overflow'|
obj/Debug/App.o||In function `std::_Vector_base<unsigned long long, std::allocator<unsigned long long> >::~_Vector_base()':|
/usr/include/c++/4.9/bits/stl_vector.h|161|undefined reference to `__ubsan_handle_sub_overflow'|
...
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build failed: 50 error(s), 0 warning(s) (0 minute(s), 23 second(s)) ===|

我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2018-10-13 13:33:53

正如在它的新家上看到的,您引用的同一篇文章已经给出了答案,但您没有注意到.大胆的地雷:

GCC最近(4.9版)获得了未定义的行为消毒剂(ubsan),这是C语言和C++语言的运行时检查器。为了用ubsan检查您的程序,请编译并将程序与-fsanitize=undefined选项链接起来。

我认为解决这个问题的正确方法不是手动链接ubsan,而是简单地将-fsanitize=undefined传递给链接器,而不仅仅是编译器。当然,重新发明轮子可能对你有用,但它是不需要的,而且可能有一个原因,这有一个具体的链接标志,而不是。

当然,这是可行的:我突然得到了一大堆未定义的引用错误,在放弃了几个月之后,尤格在这里的回答给了我正确的方向:我只是把-fsanitize=undefined传递给meson.add_project_arguments(),但是那些只传递给编译器;我还需要将它传递给meson.add_project_link_arguments()。添加之后,错误就消失了,程序链接了。

票数 19
EN

Stack Overflow用户

发布于 2015-08-04 08:42:20

我安装了libubsan0lib64ubsan0,添加了-lubsan选项,我的应用程序编译成功了!

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31803705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档