問題タブ [ubsan]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 動的にロードされる共有ライブラリで UBSAN を使用する
プロジェクトで UBSAN を使用しようとしたところ、修正が不可能と思われる問題が発生しました。このプロジェクトでは、共有ライブラリを介して実装されたプラグイン システムが使用されています。つまり、各プラグインは、プラグイン固有の派生クラスを持つ抽象クラスのインスタンスを返すファクトリ メソッドを提供します。次に、プロジェクトはフォルダー内のすべての共有ライブラリを反復処理し、それらを で開き、dlopen
経由でファクトリ メソッドを取得し、dlsym
使用されるプラグイン インスタンスを作成します。
ただし、UBSAN がスローするインターフェイス メソッドを使用すると、member call on address 0x... which does not point to an object of type '...'
MWE:
foo.h
foo.cpp
main.cpp
コンパイル:
g++ -shared -fPIC -o libfoo.so foo.cpp
g++ -fsanitize=vptr main.cpp -ldl
./a.out
https://whatofhow.wordpress.com/2015/03/17/odr-rtti-dsoは、これは共有ライブラリの RTTI 情報とバイナリが異なるためであると説明しています。
共有ライブラリで関数をエクスポートし、それをインポートしdlsym
て呼び出しようとすると、非常によく似た問題が発生します。結果は for clang になりcall to function <...> through pointer to incorrect function type '<...>'
ます-fsanitize=function
。
これを解決する方法はありますか?私はClangを使用していないか、遊んで-fvisibility
いないので、ここで何をすべきかわかりません。
c++ - この C++ UBSAN vptr ランタイム エラーを修正する方法 (ランタイム エラー: アドレスのメンバー呼び出し)
プロジェクトで ubsan テスト (-fsanitize=undefined) を有効にしましたが、いくつかの ubsan ランタイム エラーが見つかりました。ここで失敗した理由を見つけるのを手伝ってくれる人はいますか? GCC と Clang でこの問題を修正するにはどうすればよいですか?
これは lib.h と lib.cpp を含む lib.so モジュールです。
lib.h:
lib.cpp:
lib.so モジュールを呼び出す実行可能モジュールは次のとおりです。
main.cpp
モジュール (lib.so および main) をビルドして main を実行すると、実行時エラーが発生します。
build_run_gcc.sh
エラー: