Clang静态分析器-具有未指定可空性的参数使“更多”未由条件指定?

时间:2019-03-12 10:44:05

标签: c++ nullable clang-static-analyzer

以下内容:

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
}

0 个答案:

没有答案