以下内容:
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
通过Clang的静态分析器触发警告:
空指针作为参数传递给'nonnull'参数
注释掉s
不是nullptr
的条件测试将删除警告。这是预期的行为,还是分析仪有问题?
详细信息:
首先,在这种条件下改变分析器对参数可为空性的假设是否是预期行为?我可以相信,这是有道理的。我只是对此感到惊讶,不知道是否确实如此。
第二,看起来有条件地将参数的可空性属性(至少就分析器而言)更改为未指定,从而引发警告。但我假设未指定可空属性的参数的默认值为已经未指定。这是一个错误的假设吗?还是就分析器而言,有条件的使得s
more 未指定(即可疑)?
请注意,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
}