用PVS在.NET内核中发现的缺陷

PVS-Studio揭示.NET Core源代码中的陷阱与挑战
本文深入探讨了PVS-Studio工具在.NET Core源代码研究中发现的问题,包括手误错误、自我初始化变量等易于识别的缺陷,以及更隐蔽的构造函数初始化顺序错误。文章强调了C++编程的复杂性,并提供了具体的代码示例来说明如何通过工具辅助发现潜在错误。

PVS Studio 的作者是一名C++静态分析师,他公布了对 CoreCLR 源代码的研究结果。虽然他的主要意图是演示工具,但它也揭示了写零缺陷的C++代码是多么地难。

\\

他们找到的第一个缺陷是手误的错误。看看下面这行代码:

\\
\if ((tree-\u0026gt;gtOper == GT_CLS_VAR ||\    tree-\u0026gt;gtOper == GT_CLS_VAR) \u0026amp;\u0026amp; i == 1)
\\

很显然,它把一个变量与一个常量比较了两次,所以这可能是个复制-粘贴的错误。(这种错误可能在任何语言中都会存在。)

\\

它们发现的另一个手误的错误应该会发生在C风格的语言中,那就是变量初始化它自身。

\\
\CorElementType elemType = elemType = TryEncodeUsingShortcut(pMT);
\\

到现在为止所说的缺陷都比较容易通过代码审查找出来。下面这个就不行喽:

\\
\CodeGenInterface::CodeGenInterface(Compiler* theCompiler) :\    compiler(theCompiler),\    gcInfo(theCompiler),     regSet(theCompiler, gcInfo)\{\}
\\

只通过这段代码你发现不了什么,但是regSet要在gcInfo之前初始化。 Svyatoslav Razmyslov 解释说,

\\

标准规定,在构建函数中的类成员初始化的顺序和它们在该类中的声明顺序是一样的。为了修复这个错误,我们应该移动类成员'gcInfo’声明的位置。

\\

如果不用类似于PVS Studio这样的工具,那么发现这类缺陷的唯一方式就是手工比较这些成员变量声明的顺序以及它们在构造函数中需要被初始化的顺序。另外,无知的重构(比如把域按字母顺序予以排列)也会引入缺陷。

\\

那么重点在于,C++编程如此之难。还有更多的例子,可阅读此篇文章:PVS-Studio: 25 Suspicious Code Fragments in CoreCLR.

\\

查看英文原文:Using PVS to Find Bugs in .NET Core

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值