.NET 4.6的RyuJIT尾递归优化的Bug
2015-08-02 08:43
162 查看
今天看到园子里有一篇新闻稿.NET 4.6的RyuJIT编译器中发现严重的Bug提到,在.Net 4.6的x64程序中默认启用新的JIT程序RyuJIT在处理尾递归指令的时候有一个Bug,导致无法得到正确的结果。
微软在其官方BlogRyuJIT Bug Advisory in the .NET Framework 4.6更是较为详细的介绍了这一bug。虽然尾递归使用得并不多(貌似在F#中有很多应用),但这个bug算是比较严重的了:
这个问题只有在应用了代码优化之后才会出现,由于多数开发者与项目都是在 DEBUG 模式开发的,因此在本地环境中看不出来。
即使发现了这个问题,一旦为进程附加了调试器就会改变它的行为,这几乎让这个问题完全隐形了。
对于这个bug,无外乎三种方案:
不使用.Net 4.6,继续使用.Net 4.5
禁用RyuJIT.
禁用尾递归优化
这三种方式中,虽然方法2和方法3可以在使用.Net 4.6的前提下解决这个bug,但需要注意的是,由于这个是.Net 4.6正式版的Bug,而JIT又是一种本地行为,需要在所有执行你的程序的机器上都应用该修改,加上这个bug是非常隐晦的,不会马上出错,出错也不一定知道是这儿出的错。这两种修改方式真正执行起来是非常困难的。
另外,在另一篇blog中提到了几个.Net 4.6的几个bug:http://nickcraver.com/blog/2015/07/27/why-you-should-wait-on-dotnet-46/,看来,在生产环境中使用.Net 4.6还得掂量掂量了。
微软在其官方BlogRyuJIT Bug Advisory in the .NET Framework 4.6更是较为详细的介绍了这一bug。虽然尾递归使用得并不多(貌似在F#中有很多应用),但这个bug算是比较严重的了:
这个问题只有在应用了代码优化之后才会出现,由于多数开发者与项目都是在 DEBUG 模式开发的,因此在本地环境中看不出来。
即使发现了这个问题,一旦为进程附加了调试器就会改变它的行为,这几乎让这个问题完全隐形了。
对于这个bug,无外乎三种方案:
不使用.Net 4.6,继续使用.Net 4.5
禁用RyuJIT.
禁用尾递归优化
这三种方式中,虽然方法2和方法3可以在使用.Net 4.6的前提下解决这个bug,但需要注意的是,由于这个是.Net 4.6正式版的Bug,而JIT又是一种本地行为,需要在所有执行你的程序的机器上都应用该修改,加上这个bug是非常隐晦的,不会马上出错,出错也不一定知道是这儿出的错。这两种修改方式真正执行起来是非常困难的。
另外,在另一篇blog中提到了几个.Net 4.6的几个bug:http://nickcraver.com/blog/2015/07/27/why-you-should-wait-on-dotnet-46/,看来,在生产环境中使用.Net 4.6还得掂量掂量了。
相关文章推荐
- 关于Android5.x适配的一点小问题(NDK error: SIGABRT)
- 内部类和匿名内部类
- 周赛-Integration of Polynomial
- 几个常用的类
- 周赛-Integration of Polynomial 分类: 比赛 2015-08-02 08:40 10人阅读 评论(0) 收藏
- 关于Github
- BestCoder Round #49 ($) 1001 Untitled
- 第11章 对话框_11.2 非模态对话框
- pattern类
- impala一些乱七八糟的整理
- 文件IO流
- 接口(打印机为例)
- 网络连接和集合、泛型
- 当爱情走了!卡卡与卡洛琳终分手 13载甜蜜缘尽
- 14个Xcode中常用的快捷键操作
- *Path Sum
- “一谷补一脏” 五谷是养生的好食材
- 周赛-Heros and Swords
- POJ 2155 Matrix 二维线段树+标记永久化?
- 周赛-Heros and Swords 分类: 比赛 2015-08-02 08:30 11人阅读 评论(0) 收藏