有可能通过clang-check来证明某些执行流程是否无法访问?因此,例如,可以发生null de-reference?
例如,在val< = 2传递给foo的情况下,ptr仍然等于nullptr。
resignFirstResponder()
谢谢。
答案 0 :(得分:1)
证明?否。
图灵的暂停问题表明,您无法证明一般程序的所有属性。从根本上说,没有程序("静态分析工具")可以决定任意谓词是(总是)是真还是(总是)假。
因此,您无法构建静态分析器,而无法正确地告诉您此代码有时会产生空指针:
p* x=null;
if (somefunction())
x=&...;
return x;
[在OP的例子中,他如何期望该工具确定val不总是大于2?]
您可以构建一个启发式工具,可以轻松地确定函数可能返回true或false。在这种情况下,它可以报告" x可能为空"。坏消息是,您的分析现在可能会报告此代码的许多变化。如果这些报告是误报,那么程序员会很快拒绝您的工具,因为这是浪费时间。
有许多静态分析工具对可能发生的事情的评估做了什么,通常不会报告这一切以避免大量的误报。