AI时代已来,你准备好应对挑战了吗? 了解详情
写点什么

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

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

关注

评论

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

架构训练营模块1作业

附加信息

架构训练营

架构实战营 1-6 学生管理云平台实战随堂测验

西山薄凉

「架构实战营」

TDengine3.0:解决高基数问题的时序数据库设计思路

TDengine

数据库 tdengine 时序数据库

深刻理解JAVA并发中的有序性问题和解决之道

JAVA旭阳

Java Java并发

架构实战营-模块1作业

小圆

2022-12-04:给定一个由 ‘[‘ ,‘]‘,‘(‘,‘)’ 组成的字符串, 请问最少插入多少个括号就能使这个字符串的所有括号左右配对, 例如当前串是 “([[])“,那么插入一个‘]‘即可满足

福大大架构师每日一题

算法 rust 福大大

企业如何应对开源软件供应链安全问题?

安势信息

开源 开源安全 软件供应链安全 开源安全与治理 清源CleanSource SCA

足球比赛中的数据科学

CnosDB

数据库 时序数据库 开源社区 CnosDB infra

mysql优化之 performance Schema常用查询sql

@下一站

MySQL 优化 12月日更 12月月更

踩坑之旅:配置 ROS 环境

eng八戒

机器人 ROS 移动机器人 机器人开发

Flutter — 仅用三个步骤就能帮你把文本变得炫酷!

编程的平行世界

flutter android

架构实战营模块一作业

张Dave

再突破!MatrixDB 在 PostgreSQL 领域获双重大奖!

YMatrix 超融合数据库

数据库 postgresql 超融合数据库 YMatrix

Python:灵活的开发环境

eng八戒

Python Python自动化办公

MongoDB源码学习:catalog与storage

云里有只猫

mongodb 源码刨析

Golong Context package

陈庆宗

Context #go

【愚公系列】2022年12月 微信小程序-组件模板和组件样式

愚公搬代码

12月月更

极客时间架构训练营作业-模块一

张建闯

架构实战营

极客时间 - 运维进阶训练营 - 第六周作业

dog_brother

CDH+Kylin三部曲之一:准备工作

程序员欣宸

大数据 kylin 12月月更

MySQL锁,锁的到底是什么?

蝉沐风

MySQL innodb MVCC

DevOps真死了?平台工程真有用?

agnostic

DevOps 平台工程

深入理解PKI

俞凡

架构 网络安全 网络

AngularJS进阶(二十二)实现时间选择插件

No Silver Bullet

AngularJS 12月月更 AngularJS时间插件

Centos7.x部署K8S集群 (基于containerd 运行时)

蜗牛也是牛

Camtasia Studio2023软件和谐版录制电脑屏幕软件

茶色酒

Camtasia Studio2023

架构实战营 - 微信业务架构图 & “学生管理系统”毕设架构设计

huiwen

架构实战营

为什么FDA和MITRE也提及SBOM ? - 解读《医疗器械网络安全区域事件准备和响应手册》

安势信息

网络安全 SCA工具 SBOM 医疗器械 安势信息

bat脚本常用命令及测试

@下一站

软件开发 BAT 12月日更 12月月更

编码开发如何开展API安全实现

穿过生命散发芬芳

12月月更

架构实战营 1-5 学生管理系统实战随堂测验

西山薄凉

「架构实战营」

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