今天看到园子里有一篇新闻稿.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,无外乎三种方案:
这三种方式中,虽然方法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还得掂量掂量了。
时间: 2024-10-25 11:26:33