4

我试图避免 C6011 警告,因为中止函数正在调用 exit()。我怎样才能做到这一点?

这是一个例子:

#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 选项或注释来避免修改代码吗?

4

3 回答 3

9

在 MSVC 中,定义__declspec(noreturn)forabort_function应该这样做。
对于 gcc,__attribute__ ((noreturn))同样如此。

于 2012-06-13T13:49:15.577 回答
2

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

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

if (p == NULL)
{
    abort_function();
    return;
}
于 2013-08-19T20:28:49.060 回答
0

在 C 中,您可以使用#pragma 消除这样的警告。小心使用它,因为您需要一些警告。这是消除此警告的#pragma:

#pragma warning(disable:6011)
于 2012-06-13T13:59:55.073 回答