質問

C ++インターフェイスを使用して、DSO/共有ライブラリのバイナリの後方互換性を破ることはそれほど難しくありません。とはいえ、2つの異なるヘッダーファイルのセットが与えられた場合、そのようなABIブレイクの検出に役立つ静的分析ツールはありますか?無料および商業製品の両方の提案は大歓迎です。

悪いプラクティス、たとえばインライン関数やDSOインターフェイスのデフォルトの関数パラメーターについて警告することもできれば、それは素晴らしいことです。

役に立ちましたか?

解決

私はあなたがこのチュートリアルに精通していると思います: C ++のバイナリ互換性の問題, 、そうでない場合 それを読んで!

このツールについて聞いたことがあります:http://ispras.linuxbase.org/index.php/abi_compliance_checker, しかし、テストまたは使用したことはないので、意見はありません。

また、これはあなたに興味があるかもしれません: Boostを使用する後方互換のABIを使用してライブラリを作成します

他のヒント

ABI Compliance-Checker - 共有C/C ++ライブラリ(DSO)の後方バイナリ/ソースレベルの互換性をチェックするためのツール:

C/C ++ライブラリの後方バイナリおよびソースレベルの互換性をチェックするためのツール。ツールは、バイナリおよび/またはソースの互換性を破る可能性のあるAPIおよびABI(ABI = API+コンパイラABI)のヘッダーファイルと共有ライブラリをチェックし、APIおよびABI(ABI = API+コンパイラABI)の変更を分析します。 、フィールドの改名など

enter image description here

私は確かめる -CインターフェイスABI/APIチェッカー:

APIおよびABIの変更のCインターフェイスを静的にチェックするためのツール。 ABIの変更を引き起こす可能性のあるタイプ宣言のすべての変更は、ほとんどのAPI変更とともに検出する必要があります。 ICHECKは、ABIドリフトを防ぐ方法として、ライブラリで使用することを目的としています。

shlib-compat - シンボルバージョンを使用した共有ライブラリのABI互換性チェッカー:

Shlib-Compatは、Dwarf Debuggingシンボルを使用して、関数引数や構造タイプなど、エクスポートされたシンボルの定義を再現および比較します。

また、あなたはに興味があるかもしれません LinuxアップストリームトラッカーLinux ABIトラッカー サービス。どちらもABI Compliance-Checkerツールを搭載しています。

私は彼らが使った仕事で覚えています GCC XML バイナリ互換性をテストするため。基本的にそれが行うことは、コンパイラオブジェクトツリーのXML表現を生成することです。理論は、XMLが同等の場合、それらのバイナリ互換性が維持されているということです。

これを行う唯一の安全な方法は、Cインターフェイスを使用してライブラリをエクスポートすることです。 C ++ライブラリは、コンパイルするために使用するコンパイラの1つとのみ互換性があります。

私たちの C ++スマート差 ツールは2つのソースファイルを比較し、言語構造(識別子、式、ステートメントなど)ともっともらしい編集アクション(挿入、削除、移動、コピー、交換識別子など)の観点から違いを報告します。

ABIの質問に直接答えませんが、それが提供する情報はかなり役立つかもしれません。別の答えで説明されている例は、からの変化のタイプです struct {a、b}struct {b、a}. 。 SmartDifferencerはそれを報告します a 動かされました。 (注:通常のDIFFツールは、構造定義を含むその行が変更されたことを報告するため、同じ情報を取得しますが、Smart -Differenceは空白/レイアウトやコメントの変更も無視し、概念的ノイズが少なくなります)。

これらのツールのどちらも報告しないのは、Typedefの定義の変更であり、別のヘッダーファイルにあります。しかし、おそらく、関係するすべてのヘッダーファイルを比較するでしょう。これを手動で行いたくない場合は、使用中のツールには基本的に完全なC ++パーサー、名前のリゾルバーが含まれている必要があり、宣言を同等性の宣言を比較する必要があります。別のポスターは、その答えをほぼ提案しました:GCCXML出力を同等性の比較。それが実際にどれほど簡単であるかはわかりません。 「ファイルは同じXMLが順調ですか?」だけではありません。

ABI-アプリケーションバイナリインターフェイスは、コンパイラがソースコードをマシンの認識可能な命令に変換する方法に帰着します。最終プログラムでは、同じソースラインを異なるバイトストリームに翻訳できます。

ソースコードを介して実行される静的アナライザーは、コンパイラがどのように翻訳するかを予測できません。その決定は、コンパイラコーディングまたは設定で行われます。この場合、静的アナライザーがあなたに役立つとは思わない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top