QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

.NET 4.6 的 RyuJIT 编译器中发现严重的 Bug

  • 2015-07-29
  • 本文字数:1185 字

    阅读完需:约 4 分钟

来自 Stack Exchange 的开发者 Nick Craver 与 Marc Gravell 在.NET 4.6 中引入的 RyuJIT 编译器中发现了一个严重的 bug,.NET 4.6 会随着 Visual Studio 2015 一起安装,并且也预装在 Windows 10 操作系统中。Craver 和 Gravell 已经提交了这个 bug 的详细说明,他们追踪到问题的根源来自于 RyuJIT 在处理尾调用优化时的一个问题。这个问题产生的结果是“……我们所调用的方法没有获得所传入的参数”,正如他们所说,如果受到此问题影响的变量原本是用于处理重要的值,那么将因此造成严重的后果。

来自微软的 Matt Mitchell 对这个发现做出了回应,他提交了一个补丁(通过 pull request)以修复这个问题。有趣的是,有人发现这个问题本来已经被修复了,但在三天前(7 月 24 日)又被微软的另一位开发者撤消了。Craver 指出,这个 bug 的存在之所以不那么容易立即发现,是由于以下几点原因:

  • 这个问题只有在应用了代码优化之后才会出现,由于多数开发者与项目都是在 DEBUG 模式开发的,因此在本地环境中看不出来。
    • 这也意味着你只能在 RELEASE 模式下发现它,对于多数人来说,这就意味着它只存在于生产环境。
  • 一旦为进程附加了调试器就会改变它的行为,这几乎让这个问题完全隐形了。
  • 如果在代码中加入一句 Debug.WriteLine(),就很可能修复这个问题,因为尾调用的方式产生了变化。

有一个重要的提示:即使微软已经在 GitHub 代码库中接受了这个补丁,也不意味着这个问题就此结束了。对于已经安装了.NET 4.6 的用户来说,微软必须为他们提供新的二进制包。Craver 建议,如果开发者还没有在生产环境上部署.NET 4.6,那么请耐心等待打了补丁的安装包出现。而如果你已经安装了.NET 4.6(无论在哪一种环境中),Craver 建议你立即关闭 RyuJIT,并且通过一些概念验证式的代码告诉开发者如何进行操作。另外还有一个重要的提示,由于这个问题所影响的是RyuJIT 编译器,因此它同样会影响那些目标为较早版本的.NET 运行时。

微软的回应(更新于2015 年7 月28 日)

来自微软的Rich Lander 对于Craver 与Gravell 的报告进行了正式的回应,他在回应中提到这个bug 仅会影响64 位进程,而不会影响32 位进程。虽然Lander 表示他的团队目前并不认为这个问题会被人利用,但他们还是会将修复代码提交至发布流程中。

在Lander 的说明中,他也推荐在使用.NET Framework 4.6 的环境中关闭RyuJIT 的方式,直到补丁包出现为止。不过,考虑到故障检测不等人,最好还是先研究一下这个bug 是否确实对你的实际情况生产了影响,因为如果你的应用程序有什么异常的行为,也有可能是别的原因引起的。

根据Lander 的说明,F#的开发者最有可能遇到由这个bug 所引起的问题,因此应当尽量避免安装.NET 4.6,Lander 在文中给出了如何重现这个问题的C#与F#示例代码。微软目前还没有说明这个补丁的发布日期。

查看英文原文: Critical Bug Revealed in .NET 4.6’s RyuJIT Compiler

2015-07-29 08:181789
用户头像

发布了 428 篇内容, 共 184.4 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

Flink + Iceberg 在去哪儿的实时数仓实践

Apache Flink

flink

油管视频下载: 如何下载油管视频到本地

科技猫

分享 教程 经验 油管视频下载 下载油管视频

我人生的里程碑之【作为独立开发者,第一次承接外包项目的心得经历,也许说出你的心声哦!】

码界西柚

程序人生 6月日更

百度灵医智惠明星案例获人民日报点赞:智慧医疗让看病更便捷

百度大脑

人工智能 智慧医疗

react源码解析9.diff算法

全栈潇晨

react源码

基于传感器的人体生命体征监控技术

不脱发的程序猿

物联网 传感器 智能医疗 人体生命体征监控技术

24道几乎必问的JVM面试题,我只会7道,你能答出几道?

北游学Java

Java 面试 JVM

程序员需要了解数据库知识么?

escray

学习 极客时间 朱赟的技术管理课 6月日更

如何针对美工与设计师的Maya工具进行版本控制

龙智—DevSecOps解决方案

centos7使用

xujiangniao

Linux

在外包5年,每天读写删改,突然发现跳不出来了

Java架构师迁哥

面试官:如何给字符串设计索引?

一个优秀的废人

MySQL 索引 字符串 索引优化

☕️【Java 技术之旅】带你一起攻克String类创建的难点分析

码界西柚

Java string pool string 6月日更

从零开始学习3D可视化之模型动画

ThingJS数字孪生引擎

可视化 模型 大屏可视化 数字时代 3D可视化

Kubernetes学习笔记之Calico CNI Plugin源码解析(二)

360技术

2021年最新版Java后端最全面试攻略,全面对标BATJ

Java 程序员 架构 面试

宜兴牵手百度智能云共建人工智能应用中心,推动数字经济创新发展

百度大脑

人工智能

博云作为专业独立PaaS厂商,入选中国PaaS市场研究报告

BoCloud博云

PaaS

准备3个月,面试10分钟,Java中高级岗面试为何越来越难?

Java架构师迁哥

毕昇JDK:为啥是ARM上超好用的JDK

华为云开发者联盟

Java 华为 jdk Openjdk 毕昇 JDK

用 CloudQuery 管理和操作数据库,更高效更安全

BinTools图尔兹

运维 dba 数据库管理工具

带你剖析鸿蒙轻内核任务栈的源代码

华为云开发者联盟

鸿蒙 任务栈 任务调度 任务上下文

阿里云官方出品:全面总结阿里云云原生架构方法论与实践经验

尹文敏

云计算 阿里云 云原生

福利时刻 十年黑客大佬的Web安全渗透技术分享

学神来啦

Linux 黑客 安全 运维自动化

建信金科大咖访谈:ISO20000及ISO27001标准体系解读

金科优源汇

如何科学制定和管理项目计划?

万事ONES

项目管理 ONES 项目经理

《原则》(九)

Changing Lin

6月日更

创业邦南立新:搭建创新生态,是奔向万亿美金市值的必经之路

创业邦

☕️【Java技术之旅】带你一起探究String类不可变的特性

码界西柚

string 原理 字符串 6月日更

开源之夏来啦,欢迎报名 Apache APISIX 项目!

API7.ai 技术团队

开源 后端 技术人生 API 网关

超全!阿里首发内部微服务架构笔记,再也不用为“微服务”苦恼了

Java架构师迁哥

.NET 4.6的RyuJIT编译器中发现严重的Bug_.NET_Jeff Martin_InfoQ精选文章