我正在尝试避免退出警告,因为一个中止函数正在调用C6011 ()。我该怎么做呢?
下面是一个示例:
#include <stdlib.h>
void abort_function();
void func( int *p );
int main()
{
int x;
func( &x );
return 0;
}
void func( int *p )
{
if (NULL == p)
abort_function();
*p = 5;
}
void abort_function()
{
exit(0);
}因此,这会导致来自PREFast的以下警告:
warning C6011: Dereferencing NULL pointer 'p': Lines: 17, 18, 20只需将abort_function()替换为exit(0)即可消除此警告。
但我实际上使用的是一个很大的代码库,我不想替换所有对abort_function()的调用。因此,我可以通过将函数设置为可变宏并临时删除函数定义来消除许多此类警告,如下所示:
#include <stdlib.h>
#define abort_function( ... ) exit(0);
/*void abort_function();*/
void func( int *p );
int main()
{
int x;
func( &x );
return 0;
}
void func( int *p )
{
if (NULL == p)
abort_function();
*p = 5;
}
#if 0
void abort_function()
{
exit(0);
}
#endif这也消除了警告,但是有没有什么PREFast选项或注释可以让我避免修改代码呢?
发布于 2012-06-13 21:49:16
在MSVC中,为abort_function定义__declspec(noreturn)应该可以做到这一点。
对于gcc,__attribute__ ((noreturn))也做了同样的事情。
发布于 2013-08-20 04:28:49
收到此警告的原因是编译器没有意识到abort_function()永远不会返回。因此,它认为存在合法的代码路径,其中p为空;调用abort_function()并返回,然后取消对p的引用。
你可以通过使用(noreturn)声明或者修改你的abort_function()调用来包含一个返回来避免它;
if (p == NULL)
{
abort_function();
return;
}发布于 2012-06-13 21:59:55
在C中,你可以使用#杂注来消除类似这样的警告。请谨慎使用它,因为您需要一些警告。以下是用于消除此警告的#杂注:
#pragma warning(disable:6011)https://stackoverflow.com/questions/11015949
复制相似问题