следующее:
int dummyStrlen (const char* /*str*/ __attribute__((nonnull))) {
return 42;
}
void f (const char* s) {
if (s != nullptr) printf ("notnull"); // Commenting-out this line removes the warning
if (dummyStrlen (s) > 0) printf ("length OK");
}
https://wandbox.org/permlink/WfIQ19lZ22Mc1bk9
вызывает предупреждение от статического анализатора Кланга:
нулевой указатель, переданный в качестве аргумента параметру 'ненулевой'
Комментирование условного теста для s
, не являющегося nullptr
, удаляет предупреждение. Это предполагаемое поведение или проблема с анализатором?
Более подробно:
Во-первых, предназначено ли такое поведение для такого условия изменять предположения анализатора об обнуляемости параметра? Я могу в это поверить, это имеет смысл. Меня это просто удивило, и я не знаю, так ли это на самом деле.
Во-вторых, похоже, что условное изменение атрибута обнуляемости параметра (по крайней мере, в отношении анализатора) на неопределенное, вызывая предупреждение. Но я предполагаю, что по умолчанию для параметров без указанного атрибута обнуляемости уже не указано. Это неправильное предположение? Или, возможно, условие делает s
больше неопределенным (то есть подозрительным) в том, что касается анализатора?
Обратите внимание, что на вышеуказанное также влияет свидетельство использования f
, если такое использование существует:
int main() {
// f(nullptr); // Uncommenting this call reintroduces the warning even if the check for nullptr in f is commented-out
// f("Thanks for all the fish"); // Uncommenting this call suppresses the warning if the above call with nullptr is not also uncommented
}