用于模型检查大型分布式C ++项目(如KDE)的工具?

时间:2010-11-10 06:42:47

标签: c++ static-analysis formal-methods formal-verification model-checking

是否有一个工具可以处理模型检查大型,真实世界,主要是C ++,分布式系统,如KDE?

(KDE是一个分布式系统,因为它使用IPC,虽然通常所有进程都在同一台机器上。顺便说一下,这是“分布式系统”的有效用法 - 检查维基百科。)

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

(假设如果该工具支持C ++,但不支持KDE使用的其他东西,例如moc,我们可以一起破解某些东西来解决这个问题。)

我将很乐意接受较少的一般(例如专门用于查找特定类型的错误的静态分析器)或更一般的静态分析替代方案,而不是实际的模型检查器。但我只对那些实际处理KDE大小和复杂程度项目的工具感兴趣。

3 个答案:

答案 0 :(得分:6)

您显然正在寻找可以

的静态分析工具
  • 按比例解析C ++
  • 找到感兴趣的代码片段
  • 提取模型
  • 将该模型传递给模型检查器
  • 向您报告结果

一个重要的问题是,每个人对于他们想要检查的模型有不同的看法。 仅凭这一点可能会让你有机会找到你想要的东西,因为每个模型提取工具 通常会选择它想要捕捉的模型,以及它匹配的机会 你想要的恰恰是恕我直言,接近于零。

您不清楚您想要建模的具体内容,但我认为您希望找到通信 原语并建模过程交互以检查死锁之类的东西?

商业静态分析工具供应商看起来似乎是一个合乎逻辑的地方,但我认为它们并不存在。 Coverity似乎是最好的选择,但似乎他们只对Java线程问题进行了某种动态分析。

本文声称要这样做,但我没有详细研究过:Compositional analysis of C/C++ programs with VeriSoft。相关的是[PDF] Computer-Assisted Assume/Guarantee Reasoning with VeriSoft。看起来你必须手工注释 用于指示感兴趣的建模元素的源代码。 Verifysoft工具本身似乎是贝尔实验室专有的,可能很难获得。

同样地:Distributed Verification of Multi-threaded C++ Programs

本文也提出了有趣的说法,但不管标题如何都不处理C ++: Runtime Model Checking of Multithreaded C/C++ Programs

虽然这一切的所有部分都很困难,但他们共同的一个问题是解析C ++(例如 先前引用的论文)并找到提供模型原始信息的代码模式。 您还需要解析您正在使用的C ++的特定方言; C ++编译器都接受不同的语言并不好。而且,正如您所观察到的,处理大型C ++代码是必要的。模型检查器(SPIN和朋友)相对容易找到。

我们的DMS Software Reengineering Toolkit提供了通用解析,可自定义模式匹配和事实提取,并且具有处理C ++的许多方言的强大C++ Front End(编辑2019年2月:在Ansi中包括C ++ 17) ,海湾合作委员会和MS口味)。它可能被配置为查找和提取与您关注的模型相对应的事实。但是这不是现成的。

带有 C 前端的DMS已用于处理极大的C应用程序(19,000个编译单元!)。 C ++前端已被广泛用于各种大型C ++项目(EDIT 2019年2月:包括跨3000多个编译单元的API的大规模重构)。鉴于DMS的一般功能,我认为它可能能够处理相当大的代码块。 YMMV。

答案 1 :(得分:1)

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

您可以尝试使用自动不变的发现工具,例如“Daikon”,在运行时捕获感知的不变量。您可以稍后验证发现的不变量(例如变量的等效性“a == b + 1”)是否有意义,然后将永久断言插入到代码中。这种方式当你因为你的改变而违反了不变量时,你会得到一个警告,也许你可能因为你的改变而破坏了某些东西。此方法有助于避免重构或更改代码以添加测试和模拟。

答案 2 :(得分:0)

将正式技术应用于大型系统的常用方法是对它们进行模块化,并为每个模块的接口编写规范。然后,您可以独立验证每个模块(在验证模块时,您导入其调用的其他模块的规范 - 但不是代码)。这种方法可以使验证具有可扩展性。