C++|VS2022 经过优化之后的空指针检测( 二 )



而类型对于代码分析来说确实十分有用 , SAL可以用来表达一个大范围的代码契约 , 我们看看下面的代码:

这个函数有一个复杂的后置条件 。 只要第一个参数为真 , 当函数存在时 , 位置 *p 处的值必须不为空 。两个引擎都理解这些契约(尽管 EspXEngine 中的支持更复杂) , 并且许多 Windows API 都被注释以描述它们的行为 。 我们很想使用标准的语言工具 , 但是 C++20 不接受契约式编程 , 我们需要一个既适用于C又适用于C++ API的解决方案 。
现有空指针检查的问题下面我来展示一些代码例子 , 其中基于EspXEngine的空指针检查具有比当前更好的行为 。首先是一些当前检查规则中难以发现的空指针错误 , 如下图所示:

下面是一些不必要的警告:

在上面的代码中 , 当前版本将在注释行上给出空指针取消引用警告 。从技术上讲 , 当 malloc 失败并返回 nullptr 时 , 此警告可能是真实的 。这是一个与许多应用程序无关的场景 。EspXEngine 有低置信度警告和高置信度警告 , 在这种情况下只会发出低置信度警告 。大多数用户可能只对预计噪声较小的高置信度警告感兴趣并关闭低置信度警告 。
此外 , 我们决定让 EspXEngine 更严格地检测各种未定义的行为:

在上面的代码中 , 与 EspXEngine 相反 , 当我们在空指针上调用方法时 , 当前规则下不会触发警告 。严格来说 , 这段代码有未定义的行为 , 但是当方法没有取消引用 this 指针时 , 许多实现都可以正常工作 。
在Visual Studio 2022 17.0 Preview 4中 , 我们将提供新的实验性质的代码检查 , 以查找空指针错误 。这些检查旨在成为当前检查的更好版本 , 具有更高的精度和附加功能 。这些新检查会进行深入的分析 , 所以会增加分析时间 。 在默认情况下 , 它们是关闭的 , 你可以使用
CppCoreCheckExperimentalRules规则来启用它们 。
总结?我是觉得还不错 。
最后Microsoft Visual C++团队的博客是我非常喜欢的博客之一 , 里面有很多关于Visual C++的知识和最新开发进展 。 大浪淘沙 , 如果你对Visual C++这门古老的技术还是那么感兴趣 , 则可以经常去他们那(或者我这)逛逛 。
本文来自:《Improved Null Pointer Dereference Detection in Visual Studio 2022 version 17.0 Preview 4》
【C++|VS2022 经过优化之后的空指针检测】