代码之家  ›  专栏  ›  技术社区  ›  jcoder

C++中有没有用于编译断言的工具?

  •  3
  • jcoder  · 技术社区  · 16 年前

    前几天我在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);
    

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

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

    3 回复  |  直到 16 年前
        1
  •  7
  •   Alex Deem    16 年前

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

    但关于第一个示例:我的风格是偏爱引用而不是指针参数或返回值,除非NULL是一个可接受的值。这样就不需要断言参数是!=无效的

        2
  •  3
  •   richj    16 年前

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

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

    Boost有一套完整的编译时工具,每种描述都有,尽管这些工具只能在编译时检测可能的运行时故障,如果您可以将测试表示为编译时不变量的话。

        3
  •  2
  •   Greg Hewgill    16 年前

    . 其中一个例子是 Coverity (一种商业产品,如果你要问“多少”,那么你买不起)。我不知道什么样的开源工具可以用于相同的目的(对于C++)。

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