1

次のコードがあります

static pthread_mutex_t watchdogMutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t watchdogCond = PTHREAD_COND_INITIALIZER;

Splint を使用すると、次のエラー/警告が表示されます

静的な watchdogCond._データ。null 値に初期化された _mutex: watchdogCond._ data. _mutex = (void )0 null 注釈のない参照が割り当てられるか、NULL に初期化されます。/ @null@*/ を使用して、null ポインターの可能性がある参照を宣言します。(警告を禁止するには -nullassign を使用します)

これの問題は何ですか?それは本当の危険ですか?

4

2 に答える 2

4

splint には null としてのポインタの明示的な初期化に問題があるようで、警告を無効にするためにある種のオーバーライド注釈コメントが必要です。私は単にそのアドバイスに従い、-nullassignオプションを使用してこの警告を無効にします. あなたのコードが何をしているのか、または実装が初期化子マクロを定義した方法について、悪いことや有害なことは何もありません。それは不合理な恐怖を持っているだけです。

于 2011-05-10T12:25:43.257 に答える
2

pthread_mutex_t不透明なポインターのようです(追跡typedefして調べることができます)。Splint では、ポインターはデフォルトで null 非許容です。null 許容ポインターが必要な場合は、セマンティック アノテーションを使用して宣言する必要があります/*@null@*/。次に例を示します。

char * ptr1;
/*@null@*/ char * ptr2;

ptr1 = NULL; /* warning: implicitly not-nullable pointer */
ptr2 = NULL; /* OK: explicitly nullable pointer */

マニュアルによると、 null 状態に関して 3 つのオプションがあります。

  • nullNULL ポインターの可能性があります。
  • notnull非 null ポインター。
  • relnullヌル チェックを緩和します。NULL が割り当てられている場合、または非 null ポインターとして使用されている場合はエラーになりません。

null 非許容ポインターを使用する利点は、ポインターを取得するたびにチェックする必要がないことです。たとえば、関数パラメーターに として注釈を付ける/*@notnull@*/と、逆参照する前に確認する必要がなくなります。if(pointer == NULL)これにより、チェックが減り、コードが簡素化されます。

これらの警告を無視することの危険性は、Splint に特定のポインターが null になる可能性がないことを伝え、後でそれに割り当てようとNULLすると、この null ポインターが逆参照されてしまい、プログラムがクラッシュする可能性があることです。

私の意見では、あなたの実際の問題は Splint のポリシーであり、すべてのポインターが暗黙的に null 不可であると見なされます。これにより、 null ポインターの可能性があるすべてのポインターに注釈を付けることが強制されます。

于 2011-05-10T13:28:19.197 に答える