22

今日、 GCC Undefined Behavior Sanitizer (ubsan)に関する記事を読みました。ただし、そこの手順に従う (コードに追加する) と、コンパイラ (Ubuntu 15.04 の GCC 4.9.2) は、いくつかの参照が定義されていないと言います。-fsanitize=undefined

||=== 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)) ===|

どうすればこれを修正できますか?

4

2 に答える 2

17

オプションをインストールlibubsan0lib64ubsan0て追加-lubsanし、アプリケーションが正常にコンパイルされました!

于 2015-08-04T08:42:20.790 に答える
15

あなたが引用したのとまったく同じ記事が、その新しい家で見られるように、すでに答えを提供していますが、あなたはそれに気づきませんでした...太字の私の:

GCC は最近 (バージョン 4.9) 、C および C++ 言語のランタイム チェッカーであるUndefined Behavior Sanitizer (ubsan) を取得しました。ubsan でプログラムをチェックするには、オプションを指定してプログラムをコンパイルおよびリンク-fsanitize=undefinedします。

これを解決する正しい方法は、手動で とリンクするのではなく、コンパイラだけでなく、リンカーにubsanも単純に渡すことだと思います。-fsanitize=undefined確かに、車輪の再発明はうまくいくかもしれませんが、それは必要ではありません。代わりに、このための特定のリンカー フラグがある理由があるかもしれません。

確かに、それはうまくいきます:私は突然未定義の参照エラーの山を手に入れました.あきらめて何ヶ月もそれを使用しなかった後、ここでのyugrの答え-fsanitize=undefinedは私を正しい方向に向けましmeson.add_project_arguments()た. ; にも渡す必要がありましたmeson.add_project_link_arguments()。それを追加した後、エラーはなくなり、プログラムはリンクします。

于 2018-10-13T13:33:53.707 に答える