あなたは明らかに、できる静的分析ツールを探しています
- C++ を大規模に解析する
- 関心のあるコードフラグメントを見つける
- モデルを抽出する
- そのモデルをモデル チェッカーに渡す
- その結果をあなたに報告する
重大な問題は、どのモデルをチェックしたいかについて、誰もが異なる考えを持っていることです。各モデル抽出ツールは通常、モデルとしてキャプチャしたいものを選択しており、必要なものと正確に一致する可能性はゼロに近いため、それだけでは、必要なものを正確に見つけるチャンスが失われる可能性があります.
具体的に何をモデル化したいのか明確ではありませんが、通信プリミティブを見つけてプロセスの相互作用をモデル化し、デッドロックのようなものをチェックしたいと思いますか?
商用の静的解析ツールのベンダーは一見当然のことのように思えますが、まだそこにはいないと思います。 Coverityが最善の策のように思えますが、Java スレッドの問題について何らかの動的分析しかできないようです。
この論文ではこれを行うと主張していますが、詳しくは調べていません。VeriSoft を使用した C/C++ プログラムの構成分析 関連は[PDF] Computer-Assisted Assume/Guarantee Reasoning with VeriSoftです。関心のあるモデリング要素を示すために、ソース コードに手動で注釈を付ける必要があるようです。Verifysoft ツール自体は、Bell Labs 独自のようであり、入手が難しい可能性があります。
同様に、これ はマルチスレッド C++ プログラムの分散検証です。
この論文も興味深い主張をしていますが、タイトルが「 Runtime Model Checking of Multithreaded C/C++ Programs」であるにもかかわらず、C++ を処理していません
。
これのすべての部分は困難ですが、すべてに共通する問題は、C++ を解析し (前に引用した論文で例示されているように)、モデルの生の情報を提供するコード パターンを見つけることです。また、使用している C++ の特定の方言を解析する必要があります。C++ コンパイラがすべて異なる言語を受け入れるのは良くありません。そして、ご覧のとおり、大きな C++ コードの処理が必要です。モデル チェッカー (SPIN など) は比較的簡単に見つかります。
当社のDMS ソフトウェア リエンジニアリング ツールキットは、カスタマイズ可能なパターン マッチングとファクト抽出を備えた汎用解析を提供し、C++ の多くの方言を処理する堅牢なC++ フロント エンドを備えています (2019 年 2 月編集: Ansi、GCC、および MS フレーバーの C++17 を含む)。 . 関心のあるモデルに対応する事実を見つけて抽出するように構成できる可能性があります。しかし、これは既製ではありません。
Cフロント エンドを備えた DMS は、非常に大きな C アプリケーション (19,000 コンパイル ユニット!) の処理に使用されています。C++ フロント エンドは、さまざまな大規模な C++ プロジェクトで怒って使用されています (2019 年 2 月編集: 3000 以上のコンパイル ユニットにわたる API の大規模なリファクタリングを含む)。DMS の一般的な機能を考えると、かなり大きなコードのチャンクを処理できる可能性が高いと思います。YMMV。