4

我们有一个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 会阻止该行执行。有没有办法以dieParasoft 识别的方式标记为不返回?


编辑:我需要在 GCC 和 VS 2003 中都可以使用的东西,但是#ifdef如果有人有一个只能在 VS 中使用的解决方案,我不会放弃解决问题的方法

4

3 回答 3

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;
于 2011-04-19T18:00:06.523 回答
2

在 gcc 中,您应该为函数赋予如下属性:

     die (const char *, ...) 
          __attribute__ ((format_arg (1)))
          __attribute__ ((noreturn))
于 2011-04-19T14:28:56.153 回答
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))(第一个例子)。

于 2011-04-19T14:24:16.157 回答