您显然正在寻找一种静态分析工具,可以
- 大规模解析 C++
- 定位感兴趣的代码片段
- 提取模型
- 将该模型传递给模型检查器
- 向您报告该结果
一个重要的问题是每个人对他们想要检查的模型有不同的想法。仅此一项就可能会扼杀您准确找到您想要的东西的机会,因为每个模型提取工具通常都会选择它想要捕获的模型,并且它与您想要的精确匹配的机会恕我直言接近于零。
您不清楚具体要建模什么,但我认为您想找到通信原语并对流程交互进行建模以检查死锁之类的东西?
商业静态分析工具供应商似乎是一个合乎逻辑的地方,但我认为他们还没有。 Coverity似乎是最好的选择,但似乎他们只对 Java 线程问题进行了某种动态分析。
这篇论文声称可以做到这一点,但我没有详细研究:Compositional analysis of C/C++programs with VeriSoft。相关的是[PDF] VeriSoft 的计算机辅助假设/保证推理。看来您必须手动注释源代码以指示感兴趣的建模元素。Verifysoft 工具本身似乎是贝尔实验室专有的,可能很难获得。
与此类似: 多线程 C++ 程序的分布式验证。
这篇论文也提出了一些有趣的主张,但没有处理 C++,尽管标题是:
多线程 C/C++ 程序的运行时模型检查。
虽然这一切都很困难,但它们都有一个共同的问题是解析 C++(如前面引用的论文所示)并找到为模型提供原始信息的代码模式。您还需要解析您正在使用的 C++ 的特定方言;C++ 编译器都接受不同的语言并不好。而且,正如您所观察到的,处理大型 C++ 代码是必要的。模型检查器(SPIN 和朋友)相对容易找到。
我们的DMS Software Reengineering Toolkit提供通用解析、可定制的模式匹配和事实提取,并具有强大的C++ 前端,可以处理许多 C++ 方言(2019 年 2 月编辑:包括 Ansi、GCC 和 MS 风格的 C++17) . 它可能被配置为查找和提取与您关心的模型相对应的事实。但它并没有现成的这样做。
带有C前端的 DMS已被用于处理超大型 C 应用程序(19,000 个编译单元!)。C++ 前端已被用于各种大型 C++ 项目(2019 年 2 月编辑:包括跨 3000 多个编译单元的 API 大规模重构)。鉴于 DMS 的一般能力,我认为它可能能够处理相当大的代码块。YMMV。