在c ++中是否有用于编译时检查断言的工具?

时间:2009-12-24 10:06:18

标签: c++ assert

前几天我在c ++中编写了一个函数,它发生在我身上,编译器可以做更多的事情来帮助我防范错误。我的代码的基本要素是这样的 -

void method(SomeType* p)
{
    assert(p != 0);
    p->something();
}

它就像这样被称为

SomeType p = NULL;
if (SomeCondition)
{
    p = some_real_value;
}

method(p);

显然,p在运行时可能为null,因此调试构建中的方法断言失败。我的错误。

然而,似乎编译器可能在编译时捕获到这一点并发出警告说它已检测到它已发现可能违反断言的可能性。

好的,这是一个简单的情况,编译器根据程序的某些流分析和跟踪每个点的可能变量范围,发现指针在该点可能是NULL是相当简单的。

我知道确定是否会违反许多断言可能太难了,但即使是很少次,编译器也能告诉我,我编写的代码可能违反了断言,它会帮助我的程序更安全。

我认为它可以帮助处理数组索引中的一个错误,例如在循环中: -

assert(index >= 0 && index < array_size);

我认为在很多情况下编译器可以在编译时证明索引变量可能超出这些边界并在编译时发出警告。

我意识到这对于编制者来说可能做的工作太多了,但也许有一些工具可以进行这种分析?我一直无法找到谷歌的任何东西,但我想知道这种类型是否存在?或者是否太难以做得好或许有用?

3 个答案:

答案 0 :(得分:7)

PC-lint等静态分析工具可能能够检测到这些问题。 http://www.gimpel.com/html/pcl.htm

关于你的第一个例子:我的风格是赞助引用而不是指针参数或返回值,除非NULL是可接受的值。这消除了断言参数的需要!= NULL。

答案 1 :(得分:3)

Boost库有一个编译时断言。一个非常简单的例子是:

#include <boost/static_assert.hpp>
...
BOOST_STATIC_ASSERT(1 > 0);

Boost在每个描述中都有一套全面的编译时工具,尽管如果你能将测试表示为编译时不变量,它们只能在编译时检测到可能的运行时故障。

答案 2 :(得分:2)

执行此类检查的工具类称为静态分析。一个这样的例子是Coverity(商业产品,如果你不得不问“多少”,那么你买不起)。我不知道什么样的开源工具可用于相同的目的(对于C ++)。

对于Java,FindBugs是一个出色的静态分析工具(不像Coverity那么全面,但你不必抵押你的房子来使用它)。