如何在Parasoft C ++测试中将函数标记为不返回?

时间:2011-04-19 14:20:03

标签: c++ static-analysis parasoft

我们有一个die函数输出错误信息并退出,例如:

void die(const char* msg) {
    fprintf(stderr, "Error: %s\n", msg);
    exit(1);
}

我们使用Parasoft C++test静态分析我们的代码,但它没有意识到die是一个非返回函数。所以当它看到如下代码时:

void foo(Bar* bar) {
    if(!bar) {
        die("bar is NULL");
    }
    Bar bar2 = *bar;
}

它警告*bar可能正在取消引用空指针,即使bar为NULL也会阻止该行执行。有没有办法以Parasoft认可的方式将die标记为不返回?


编辑:我需要能够在GCC和VS 2003中运行的东西,但如果某人有一个仅适用于VS的解决方案,我就不会高于#ifdef

3 个答案:

答案 0 :(得分:3)

我明白了。事实证明,Parasoft有一个内置的NRF列表,您可以自定义;它们被称为“终止功能”。如果在VS

之外运行Parasoft,则可以通过VS GUI或配置文件对其进行编辑

通过Visual Studio

通过配置文件

添加以下内容:

com.parasoft.xtest.checker.flowanalysis.terminators.api0.methods=active\=true|name\=die|type\=*|paramsn\=*|defsInSubClasses\=true;
com.parasoft.xtest.checker.flowanalysis.terminators.apis=active\=true|name\=foo;

答案 1 :(得分:2)

在gcc中,您应该将函数归类为:

     die (const char *, ...) 
          __attribute__ ((format_arg (1)))
          __attribute__ ((noreturn))

答案 2 :(得分:1)

如果您使用的是Visual Studio 2005+,则可以使用__declspec(noreturn),如下所示:

__declspec(noreturn) void die(char const* msg){
  fprntf(stderr, "Error: %s\n"; msg);
  exit(1);
}

也许这有助于Parasoft将该功能识别为不返回。
修改: GCC有__attribute__((noreturn))(第一个例子)。