4

中止関数が exit() を呼び出しているため、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 オプションまたは注釈はありますか?

4

3 に答える 3

9

MSVC では、__declspec(noreturn)forを定義するabort_functionことでそれを行う必要があります。
gcc__attribute__ ((noreturn))の場合も同じです。

于 2012-06-13T13:49:15.577 に答える
2

この警告が表示される理由は、コンパイラが abort_function() が返されないことを認識していないためです。したがって、p が NULL である正当なコード パスがあると考えられます。abort_function() が呼び出されて戻り、p を逆参照します。

(noreturn) 宣言を使用するか、abort_function() 呼び出しを変更して return を含めることで、これを回避できます。

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 に答える