Статический анализатор Clang - параметр с неопределенной обнуляемостью, сделанный условным «больше» неопределенным? - PullRequest
1 голос
/ 12 марта 2019

следующее:

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
}
...