最好不要依赖编译器的内存自动初始化功能

一个安全漏洞来源

读取未初始化的内存是C和C++程序中的一个主要安全漏洞来源。微软已经开发了很多工具来寻找这样的错误,包括编译器警告,静态分析检查,以及最近开发出来的:代码仪表(Code Instrumentation)。
如需了解有关未初始化内存访问带来的安全问题和缓解措施,大家可以到MSRC(微软安全响应中心)的博客里去看看。
今天的这篇文章会总结一下代码分析和代码仪表之间可能的交互操作,以及VS2019 v16.9.1中我们所做出的优化。

当我们打开MSVC编译器的自动初始化功能时,编译器会以一种模式来初始化栈上的内存结构。这个解决方案能够用来缓解上面提到的安全问题。但是,为了保持最小的性能损失,编译器不会初始化所有的内存结构。它采用的是一种尽力而为的方法,试图在缓解安全风险和避免明显的性能下降方面取得良好的平衡。

此外,这是一种非标准的功能,这意味着,在其他编译器或同一编译器的其他版本中可能不可用(或行为可能不同)。 结果就是,用户永远不要依赖这种工具。 正确的解决方法是显式初始化源代码中的内存,并且仅使用检测手段来缓解代码审查,静态分析或质量保证过程中的任何其他工具所漏入的任何错误。

结果,我们希望编译器对以下代码发出警告,无论用于编译代码的选项是怎样设置的:

最好不要依赖编译器的内存自动初始化功能_第1张图片

 

从Visual Studio 2019版本16.9.1和16.10预览版2开始,我们确保代码分析始终将编写的代码视为与检测版本相反的代码。此行为与其他工具链一致,并鼓励开发人员不要依赖自动初始化功能。

总结

我的做法是,声明一个变量后,立即对其初始化。
没有例外!

最后

Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新的开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。
本文来自:《Ignoring Automatic Initialization for Code Analysis》

最好不要依赖编译器的内存自动初始化功能_第2张图片

你可能感兴趣的:(OldNewThing)