C++ 用于检查大型分布式C++;像KDE这样的项目?

C++ 用于检查大型分布式C++;像KDE这样的项目?,c++,static-analysis,formal-methods,formal-verification,model-checking,C++,Static Analysis,Formal Methods,Formal Verification,Model Checking,是否有一种工具可以处理大型、真实世界、主要是C++分布式系统(如KDE)的模型检查 (KDE是一个分布式系统,因为它使用IPC,尽管通常所有进程都在同一台机器上。是的,顺便说一句,这是“分布式系统”的一个有效用法-查看Wikipedia。) 该工具需要能够处理进程内事件和进程间消息 (假设工具支持C++,但不支持KDE使用MOC等其他东西,我们可以把一些东西组合在一起,以解决这个问题。) 我很乐意接受不太通用的(例如,专门用于查找特定类别错误的静态分析仪)或更通用的静态分析替代方案,以代替实际的

是否有一种工具可以处理大型、真实世界、主要是C++分布式系统(如KDE)的模型检查

(KDE是一个分布式系统,因为它使用IPC,尽管通常所有进程都在同一台机器上。是的,顺便说一句,这是“分布式系统”的一个有效用法-查看Wikipedia。)

该工具需要能够处理进程内事件和进程间消息

(假设工具支持C++,但不支持KDE使用MOC等其他东西,我们可以把一些东西组合在一起,以解决这个问题。)


我很乐意接受不太通用的(例如,专门用于查找特定类别错误的静态分析仪)或更通用的静态分析替代方案,以代替实际的模型检查。但我只对能够实际处理KDE规模和复杂性的项目的工具感兴趣。

您显然在寻找一种能够

    < LI>在比例上解析C++
  • 找到感兴趣的代码片段
  • 提取模型
  • 将该模型传递给模型检查器
  • 把结果报告给你
一个重要的问题是,每个人对他们想要检查的模型都有不同的想法。 仅此一点就可能扼杀您准确找到所需内容的机会,因为每个模型提取工具 通常都会选择要捕获什么作为模型,以及匹配的机会 你想要的正是接近于零的IMHO

你不清楚你具体想做什么,但我认为你想找到沟通 对流程交互进行原语和建模,以检查是否存在死锁

商业静态分析工具供应商似乎是一个合理的选择,但我认为他们还没有出现。这似乎是最好的选择,但似乎他们只有一些Java线程问题的动态分析

这篇文章声称这样做,但我没有详细研究:。相关的是。看来您必须手动添加注释 表示感兴趣的建模元素的源代码。Verifysoft工具本身似乎是贝尔实验室的专有工具,可能很难获得

类似地,这个:

本文还提出了有趣的说法,但不处理C++,尽管标题是:

虽然所有的部分都是困难的,但它们都共享的问题是解析C++(如 找到为模型提供原始信息的代码模式。 你还需要解析你使用的C++的特定方言;C++编译器都接受不同的语言是不好的。而且,正如你观察到的,处理大型C++代码是必要的。模型检查器(旋转和朋友)相对容易找到

我们提供通用解析,可定制模式匹配和事实提取,并具有强大的处理C++的许多方言(编辑FEB 2019:包括Ansi中的C++ 17、GCC和MS调味品)。它可能被配置为查找和提取与您关心的模型对应的事实。但这不是现成的


DMS及其C前端已被用于处理超大的C应用程序(19000个编译单元!)。C++前端已经被用于各种大规模C++项目的愤怒(编辑FEB 2019:包括API的大规模重构,跨越3000个+编译单元)。鉴于DMS的一般功能,我认为它可能能够处理相当大的代码块。YMMV.

静态代码分析器首次用于大型代码库时,通常会产生大量警告和警报,您无法在合理的时间内分析所有这些警告和警报。很难从工具看起来可疑的代码中挑出真正的问题


您可以尝试使用自动不变量发现工具,如“Daikon”,在运行时捕获感知到的不变量。如果发现的不变量(例如变量“a==b+1”的等价性)有意义,您可以稍后进行验证,然后将永久性断言插入到代码中。这样,当您的更改违反了不变量时,您将收到一条警告,可能是您的更改破坏了某些内容。此方法有助于避免重新构造或更改代码以添加测试和模拟

将形式化技术应用于大型系统的通常方法是将它们模块化,并为每个模块的接口编写规范。然后,您可以独立地验证每个模块(在验证模块时,您导入它调用的其他模块的规范,而不是代码)。这种方法使得验证可扩展性。< /P>有大的非真实世界,主要是C++分布式系统吗?你能澄清一下你所说的模型检查是什么意思吗?我肯定他指的是属性的状态空间检查(的某个特定实例),他给了我们一个提示,告诉我们他有一个使用消息传递原语的分布式系统,因此有一组由进程交互形成的隐含状态。但细节很重要。这与其说是答案,不如说是对问题的评论。我很欣赏这是一种方法,但实际上这是一种昂贵的方法,而且它并没有回答一个具体的问题:哪种工具适合这种实际应用?