Кажется, что 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 варианта относительно нулевого состояния em>:
null
Возможно, нулевой указатель.
notnull
Ненулевой указатель.
relnull
Ослабьте нулевую проверку. Нет ошибок, если ему присвоено значение NULL или когда он используется как ненулевой указатель.
Преимущество использования указателей, не допускающих значения NULL, заключается в том, что вам не нужно проверять их каждый раз, когда вы получаете один из них. Например, вы можете аннотировать параметр функции как /*@notnull@*/
, и тогда вам не требуется проверять if(pointer == NULL)
перед его разыменованием. Это сокращает количество проверок и упрощает ваш код.
Опасность игнорирования этих предупреждений заключается в том, что если вы сообщаете Splint, что конкретный указатель не может быть нулевым, а позже вы пытаетесь присвоить ему NULL
, это нулевой указатель может быть разыменован, и программа может вылететь.
На мой взгляд, ваша актуальная проблема - это политика Splint, которая считает, что все указатели неявно не допускают значения NULL. Это заставляет вас аннотировать все ваши возможно нулевые указатели.
person
Guillermo Calvo
schedule
10.05.2011