读取未初始化的内存是C和C++程序安全漏洞的主要来源之一。微软开发了许多工具来发现这些错误,包括编译器警告、静态分析检查,以及最近的代码插装。 有关未初始化内存相关漏洞和缓解措施的更详细概述,请参阅 微软安全响应中心的博客文章 . 这篇博文总结了代码分析和代码插装之间的潜在交互,以及我们在VisualStudio2019版本16.9.1中所做的改进。
当我们打开MSVC的自动初始化特性时,它将用一个模式初始化堆栈上的某些构造。此解决方案有助于降低读取未初始化内存的风险。但是,为了使这种缓解措施的性能开销保持最小,编译器不会初始化所有内容。这是一种尽最大努力的方法,它试图在降低安全风险和避免明显的性能退化方面达到良好的平衡。此外,这是一个非标准特性,在其他编译器或同一编译器的其他版本中可能不可用(或可能表现不同)。因此,用户永远不应该依赖这样的工具。正确的解决方法是显式初始化源代码中的内存,并且只使用工具作为通过代码检查、静态分析或QA过程的任何其他工具的任何错误的缓解措施。
因此,我们希望编译器对以下代码发出警告,而不管 用于编译代码的选项:
void g(int); void f() { int l; g(l); // Warning C6001 expected regardless of the build configuration. }
从VisualStudio2019版本16.9.1和16.10预览版2开始,我们确保代码分析始终将代码视为编写的,而不是插入指令的版本。 此行为与其他工具链一致,并鼓励开发人员不要依赖自动初始化功能。
下载 最新的 Visual Studio 2019预览 今天就来试试。我们很乐意收到您的来信,帮助我们确定优先级并为您构建合适的功能。我们可以通过以下评论联系到您, 开发者社区 ,和Twitter( @视觉 ). 提交bug或建议特性的最佳方法是通过开发者社区。