3

前几天我正在用 c++ 编写一个函数,我突然想到编译器可以做更多的事情来帮助我防止错误。我的代码的要点是这样的 -

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

它被称为这样

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

method(p);

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

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

好的,这是一个简单的例子,编译器很容易根据程序的一些流分析和跟踪每个点的可能变量范围来发现指针在该点可能为 NULL。

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

我认为它也有助于解决数组索引中的一个错误之类的问题,例如在循环中:-

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

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

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

4

3 回答 3

7

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

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

于 2009-12-24T10:12:51.947 回答
3

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

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

Boost 有一套全面的编译时工具,适用于各种描述,但如果您可以将测试表示为编译时不变量,这些工具只能在编译时检测可能的运行时故障。

于 2009-12-24T10:12:36.563 回答
2

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

对于 Java,FindBugs是一款出色的静态分析工具(不如 Coverity 全面,但您不必抵押房屋即可使用它)。

于 2009-12-24T10:10:20.827 回答