首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免由于abort函数调用C6011 ()而导致无效的警告退出

如何避免由于abort函数调用C6011 ()而导致无效的警告退出
EN

Stack Overflow用户
提问于 2012-06-13 21:31:42
回答 3查看 2.2K关注 0票数 4

我正在尝试避免退出警告,因为一个中止函数正在调用C6011 ()。我该怎么做呢?

下面是一个示例:

代码语言:javascript
复制
#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的以下警告:

代码语言:javascript
复制
warning C6011: Dereferencing NULL pointer 'p': Lines: 17, 18, 20

只需将abort_function()替换为exit(0)即可消除此警告。

但我实际上使用的是一个很大的代码库,我不想替换所有对abort_function()的调用。因此,我可以通过将函数设置为可变宏并临时删除函数定义来消除许多此类警告,如下所示:

代码语言:javascript
复制
#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选项或注释可以让我避免修改代码呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-13 21:49:16

在MSVC中,为abort_function定义__declspec(noreturn)应该可以做到这一点。

对于gcc,__attribute__ ((noreturn))也做了同样的事情。

票数 9
EN

Stack Overflow用户

发布于 2013-08-20 04:28:49

收到此警告的原因是编译器没有意识到abort_function()永远不会返回。因此,它认为存在合法的代码路径,其中p为空;调用abort_function()并返回,然后取消对p的引用。

你可以通过使用(noreturn)声明或者修改你的abort_function()调用来包含一个返回来避免它;

代码语言:javascript
复制
if (p == NULL)
{
    abort_function();
    return;
}
票数 2
EN

Stack Overflow用户

发布于 2012-06-13 21:59:55

在C中,你可以使用#杂注来消除类似这样的警告。请谨慎使用它,因为您需要一些警告。以下是用于消除此警告的#杂注:

代码语言:javascript
复制
#pragma warning(disable:6011)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11015949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档