PTHREAD_COND_INITIALIZER против Splint - PullRequest
1 голос
/ 10 мая 2011

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 10 мая 2011

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

2 голосов
/ 10 мая 2011

Кажется, что pthread_mutex_t - это непрозрачный указатель (вы можете отследить typedef вниз, чтобы узнать).В Splint указатели по умолчанию не обнуляются .Если вы хотите иметь обнуляемый указатель, вы должны объявить его семантической аннотацией /*@null@*/, например:

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

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

В соответствии с руководством , есть 3 варианта относительно Нулевое состояние :

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

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

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

По моему мнению, ваша настоящая проблема - это политика Splint, которая неявно считает все указатели не-nullable.Это заставляет вас аннотировать все ваши возможно нулевые указатели.

...