clang 静态分析 - 检查与执行流程相关的可空变量初始化

clang static analysis - check null-able variable initialization with respect of execution flow

如果某些执行流程可能无法访问,是否可以用 clang-check 来证明?并且因此,例如,可能会发生空引用?

例如,如果 val <= 2 传递给 foo,ptr 仍然等于 nullptr。

struct mystruct  {  int field; };

mystruct *foo(bool arg1, int val)
{
  mystruct ptr = nullptr;

  if (!arg1)  return ptr;

  if (val  > 2 )
    ptr = new mystruct;


  ptr->field = val; // <<<< -- here 

  return ptr;
}

谢谢。

证明?编号

图灵的停机问题表明您无法证明程序的所有属性。从根本上说,没有程序 ("static analysis tool") 可以决定任意谓词是(总是)真还是(总是)假。

因此你无法构建一个静态分析器,它可以正确地告诉你这段代码有时会产生一个空指针:

 p* x=null;
 if (somefunction())
    x=&...;
 return x;

[在 OP 的示例中,他如何期望该工具确定 val 并不总是大于 2?]

您可以构建一个启发式工具,该工具可以简单地决定一个函数可能 return 是真还是假。在那种情况下,它可以报告 "x is possibly null"。坏消息是,您的分析现在可能会报告此代码的许多变体。如果这些报告是误报,您的工具将很快被程序员拒绝,因为太浪费时间了。

许多静态分析工具所做的评估是可能会发生一些不好的事情,通常不会全部报告以避免误报泛滥。