今日私は 記事 についてGCC Undefined Behavior Sanitizer(ubsan)を読みました。ただし、そこで手順を実行すると(コードに-fsanitize=undefined
を追加)、コンパイラー(Ubuntu15.04のGCC4.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)) ===|
どうすればこれを修正できますか?
libubsan0
とlib64ubsan0
をインストールし、-lubsan
オプションを追加しましたが、アプリケーションは正常にコンパイルされました。
その新しい家 で見られるように、あなたが引用したのとまったく同じ記事がすでに答えを提供していますが、あなたはそれに気づいていませんでした...大胆な私の:
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()
に渡す必要がありました。それを追加すると、エラーはなくなり、プログラムがリンクします。