PTHREAD_COND_INITIALIZER против шины

У меня есть следующий код

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

и я получаю следующие ошибки / предупреждения при использовании Splint

Статический watchdogCond._ data. _mutex инициализирован нулевым значением: watchdogCond._ data. _mutex = (void ) 0 Назначена или инициализирована ссылка без нулевой аннотации в NULL. Используйте / @null @ * /, чтобы объявить ссылку как возможно нулевой указатель. (Используйте -nullassign, чтобы запретить предупреждение)

В чем проблема и действительно ли это опасность?


person some_id    schedule 10.05.2011    source источник


Ответы (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 */

Согласно руководству, существует 3 варианта относительно нулевого состояния :

  • null Возможно, нулевой указатель.
  • notnull Ненулевой указатель.
  • relnull Ослабьте нулевую проверку. Нет ошибок, если ему присвоено значение NULL или когда он используется как ненулевой указатель.

Преимущество использования указателей, не допускающих значения NULL, заключается в том, что вам не нужно проверять их каждый раз, когда вы получаете один из них. Например, вы можете аннотировать параметр функции как /*@notnull@*/, и тогда вам не требуется проверять if(pointer == NULL) перед его разыменованием. Это сокращает количество проверок и упрощает ваш код.

Опасность игнорирования этих предупреждений заключается в том, что если вы сообщаете Splint, что конкретный указатель не может быть нулевым, а позже вы пытаетесь присвоить ему NULL, это нулевой указатель может быть разыменован, и программа может вылететь.

На мой взгляд, ваша актуальная проблема - это политика Splint, которая считает, что все указатели неявно не допускают значения NULL. Это заставляет вас аннотировать все ваши возможно нулевые указатели.

person Guillermo Calvo    schedule 10.05.2011

Похоже, что у splint есть проблема с явной инициализацией указателей как null. И требуется какой-то комментарий переопределения-аннотации, чтобы отключить предупреждение. Я бы просто последовал его совету и использовал параметр -nullassign, чтобы отключить это предупреждение. Нет ничего плохого или вредного в том, что делает ваш код или как реализация определяет макросы инициализатора. Это просто шина иррациональные страхи.

person R.. GitHub STOP HELPING ICE    schedule 10.05.2011
comment
Спасибо. Сплинт что-то говорит о том, что он не может продолжать проверку источника после этой ошибки, о которой я упоминал выше. - person some_id; 10.05.2011
comment
Используйте параметр -nullassign, чтобы отключить эту проверку. - person R.. GitHub STOP HELPING ICE; 10.05.2011