今天我在文章上读到了关于,GCC,行为消毒剂(ubsan)的文章。但是,当我按照步骤(将-fsanitize=undefined
添加到我的代码)时,编译器(Ubuntu15.04上的GCC 4.9.2 )说有些引用没有定义:
||=== 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)) ===|
我怎么才能解决这个问题?
发布于 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()
。添加之后,错误就消失了,程序链接了。
发布于 2015-08-04 08:42:20
我安装了libubsan0
和lib64ubsan0
,添加了-lubsan
选项,我的应用程序编译成功了!
https://stackoverflow.com/questions/31803705
复制相似问题