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"。坏消息是,您的分析现在可能会报告此代码的许多变体。如果这些报告是误报,您的工具将很快被程序员拒绝,因为太浪费时间了。
许多静态分析工具所做的评估是可能会发生一些不好的事情,通常不会全部报告以避免误报泛滥。
如果某些执行流程可能无法访问,是否可以用 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"。坏消息是,您的分析现在可能会报告此代码的许多变体。如果这些报告是误报,您的工具将很快被程序员拒绝,因为太浪费时间了。
许多静态分析工具所做的评估是可能会发生一些不好的事情,通常不会全部报告以避免误报泛滥。