写点什么

.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:181722
用户头像

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

关注

评论

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

国内互联网公司为什么加班这么狠?(1),程序员翻身之路

android 程序员 移动开发

图文DEMO并茂讲解RecyclerView滑动时回收和复用触发的时机

android 程序员 移动开发

图解:HTTP 范围请求,助力断点续传,android游戏开发入门

android 程序员 移动开发

在Android项目中接入Flutter,在Flutter使用安卓布局---草稿

android 程序员 移动开发

基于Android的特征X射线谱识别系统的开发,android指纹识别

android 程序员 移动开发

事务是如何影响你的系统(二)

卢卡多多

11月日更

坊间传言:程序员可以先在大厂镀金,以后去中小厂毫无压力

android 程序员 移动开发

大厂一步到位:Android-基础+Android高级,android物联网开发从入门到实战

android 程序员 移动开发

大学毕业做音视频开发,月入20K,你呢,kotlin协程面试

android 程序员 移动开发

回眸重探锁机制,高级android工程师

android 程序员 移动开发

因为不了解Android事件分发机制,居然被实习生嘲笑了,成长路线图

android 程序员 移动开发

在线等!阿里、百度一面就惨遭吊打,kotlin语言书籍

android 程序员 移动开发

“神算子”上线!EasyDL时序预测模型零门槛轻松上手

百度大脑

人工智能 百度

大众点评App的短视频耗电量优化实战,通宵都要看完这个Android关键技术点

android 程序员 移动开发

大型Bat面试知识总结分享—AMS在Android起到什么作用?简单的分析下Android的源码

android 程序员 移动开发

天高任鸟飞,在你还苦闷Android出路时,总有人在系统钻研为高级开发做准备

android 程序员 移动开发

国庆节不知道学什么?这份 Android 优秀技术文章清单请收下

android 程序员 移动开发

在中国程序员是青春饭吗?,android开发基础入门教程

android 程序员 移动开发

Android线程思考

轻口味

android 多线程 11月日更

备战秋招-阿里巴巴面试真题:-给你一个Demo-你如何快速定位ANR?

android 程序员 移动开发

备战阿里面试一年半顺利通过二面,面对突如其来的疫情,让我的阿里三面搁浅ing

android 程序员 移动开发

大神一招搞定:ReentrantReadWriteLock-几道小小数学题就够了。

android 程序员 移动开发

Google 的 Firebase 如何删除项目

HoneyMoose

图解:HTTP 范围请求,助力断点续传(1),成功入职腾讯月薪45K

android 程序员 移动开发

备战金九银十:Android面试10+个知识点总结宝典助你通关

android 程序员 移动开发

大牛耗时一年:深入探索-Android-包体积优化,共三万字建议收藏上(1)

android 程序员 移动开发

大牛耗时一年:深入探索-Android-包体积优化,共三万字建议收藏上

android 程序员 移动开发

国内互联网公司为什么加班这么狠?,音视频学习指南来咯

android 程序员 移动开发

在-View-上使用挂起函数,app开发面试题及答案

android 程序员 移动开发

基本功---Litho的使用及原理剖析,10年阿里开发架构师经验分享

android 程序员 移动开发

大学计算机专业,什么水平可以进大厂?,解密Android开发常见误区

android 程序员 移动开发

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