web-dev-qa-db-ja.com

GCC Undefined BehaviorSanitizerの使用

今日私は 記事 について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)) ===|

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

16
Ilya

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

16
Ilya

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

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()に渡す必要がありました。それを追加すると、エラーはなくなり、プログラムがリンクします。

4
underscore_d