BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Jonathan Allen 关注 595 他的粉丝 ,译者 夏雪 关注 0 他的粉丝 发布于 2015年3月23日. 估计阅读时间: 2 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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

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

if ((tree->gtOper == GT_CLS_VAR ||
    tree->gtOper == GT_CLS_VAR) && 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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT