我们有一个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
。
答案 0 :(得分:3)
我明白了。事实证明,Parasoft有一个内置的NRF列表,您可以自定义;它们被称为“终止功能”。如果在VS
之外运行Parasoft,则可以通过VS GUI或配置文件对其进行编辑Test Configurations
菜单C++test
对话框
Static
标签BugDetective Options
子标签选择Terminators
子子标签
Screenshot of the window http://so.mrozekma.com/parasoft1.png
添加一个带有非返回函数名称的新条目
Screenshot of the entry http://so.mrozekma.com/parasoft2.png
添加以下内容:
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))
(第一个例子)。