今天我读了an article关于GCC Undefined Behavior Sanitizer(ubsan)。然而,当我按照那里的步骤(将-fsanitize=undefined
添加到我的代码中),编译器(Ubuntu 15.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)) ===|
我该怎么解决这个问题?
2条答案
按热度按时间zf2sa74q1#
您引用的文章,如its new home所示,已经提供了答案,但您没有注意到它:-)粗体:
GCC最近(版本4.9)获得了 Undefined Behavior Sanitizer(ubsan),这是一个用于C和 C++ 的运行时检查器。为了用ubsan检查您的程序,请使用
-fsanitize=undefined
选项编译并链接程序。我认为解决这个问题的正确方法不是手动链接
ubsan
,而是简单地将-fsanitize=undefined
传递给链接器,而不仅仅是编译器。当然,重新发明轮子可能对您有用,但这并不是必需的,而且可能有一个原因,即有一个特定的链接器标志。当然,这是可行的:我突然得到了成堆的未定义引用错误,在放弃并且几个月没有使用它之后,yugr's answer here为我指出了正确的方向:我只是将
-fsanitize=undefined
传递给meson.add_project_arguments()
,但它们只会进入编译器;我还需要将它传递给meson.add_project_link_arguments()
。添加后,错误消失,程序链接。afdcj2ne2#
我已经安装了
libubsan0
和lib64ubsan0
,并添加了-lubsan
选项,我的应用程序编译成功!