7

ポインターを期待する関数を呼び出して値を渡すと、この警告が表示されます。これは気に入っています。

しかし、値がたまたまリテラル '0' の場合、警告は表示されません。これは、C が値ではなくヌル ポインターであると考えているためだと思います。0 リテラルの警告を表示する方法はありますか? そのために既にいくつかのバグがあったからです。

4

5 に答える 5

5

GCC は、 (警告オプションが有効になっている限り) 必要なことを実行できるnonnull関数パラメーターの属性をサポートしています。-Wnonnull

void* foo( int* cannot_be_null)  __attribute((nonnull (1))) ;


int main(int argc, char *argv[])
{
    int x;
    foo(&x);

    foo(0);  // line 13 - generates a -Wnonnull warning

    return 0;
}

を使用してコンパイルするgcc -c -Wnonnull test.cと、次のようになります。

test.c: In function 'main':
test.c:13:5: warning: null argument where non-null required (argument 1) [-Wnonnull]

でこれを強制的にエラーにすることができます-Werror=nonnull

この警告は、null ポインター リテラル (の別の名前0) が使用されている場合にのみスローされることに注意してください。次のコードは警告をトリガーしません。

int* p = NULL;
foo(p);
于 2013-01-30T18:22:14.417 に答える
1

残念ながら、生のCコンパイラではありません。これについては、スプリントなどの糸くずツールを試す必要があります (ただし、よくわかりません)。

于 2013-01-30T18:00:01.450 に答える
0

nullへの変換は、おそらくコンパイラにかなり固有のものだと思います。ただし、これらのケースはかなり一意であるため、静的にチェックするのは簡単です。

(int)0ではなくnullを渡すことを期待している場合は、明示的なNULL列挙型または定義を使用してから、パターンYourFunction(0)に一致するものを使用します。(空白を考慮に入れる)は間違いなく無効です。ローテクになりたい場合は、Grepを非常に簡単に使用できます。Fabienが提案したように、さまざまなリントツールでこれを実行できる可能性があります。

コーディングするときは、できれば間違ったものをできるだけ間違って見えるようにして、それをより簡単に検出できるようにすることを常に覚えています。

于 2013-01-30T18:10:14.267 に答える
0

この質問は質問に似ています。Should I use symbolic names like TRUE and FALSE for Boolean constants, or plain 1 and 0?

C プログラマーは、NULL と 0 がポインター コンテキストで交換可能であること、およびキャストされていない 0 が完全に受け入れられることを理解する必要があります。NULL (0 ではなく) の使用は、ポインターが関係していることを穏やかに思い出させるものと見なす必要があります。プログラマーは、ポインター 0 と整数 0 を区別するために (自分自身の理解またはコンパイラーの理解のために) それに依存するべきではありません。

NULL と 0 が等しいのは、ポインタ コンテキストだけです。別の種類の 0 が必要な場合は NULL を使用しないでください。それが機能する可能性があります。使用すると、間違ったスタイルのメッセージが送信されるためです。(さらに、ANSI では NULL の定義を ((void *)0) にすることができますが、これはポインター以外のコンテキストではまったく機能しません。) 特に、ASCII ヌル文字 (NUL) が必要な場合は NULL を使用しないでください。独自の定義を提供する

#define NUL '\0'

あなたがしなければならない場合。

この情報はこのリンクからのものです

于 2013-01-30T18:39:01.950 に答える
0

0リテラルの警告を引き続き取得する方法はありますか

私はそれについて知りませんが、とにかくあなたはそれを望んでいません。定数数値 0 は、ポインターに割り当てられるとNULL、ポインター型にキャストしないものとして暗黙的に扱われます。

于 2013-01-30T17:59:53.920 に答える