Кажется, что 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.Это заставляет вас аннотировать все ваши возможно нулевые указатели.