.NET 4.6的RyuJIT尾遞歸優化的Bug

今天看到園子裏有一篇新聞稿.NET 4.6的RyuJIT編譯器中發現嚴重的Bug提到,在.Net 4.6的x64程序中默認啓用新的JIT程序RyuJIT在處理尾遞歸指令的時候有一個Bug,致使沒法獲得正確的結果。git

微軟在其官方BlogRyuJIT Bug Advisory in the .NET Framework 4.6更是較爲詳細的介紹了這一bug。雖然尾遞歸使用得並很少(貌似在F#中有不少應用),但這個bug算是比較嚴重的了:github

  1. 這個問題只有在應用了代碼優化以後纔會出現,因爲多數開發者與項目都是在 DEBUG 模式開發的,所以在本地環境中看不出來。
  2. 即便發現了這個問題,一旦爲進程附加了調試器就會改變它的行爲,這幾乎讓這個問題徹底隱形了。

對於這個bug,無外乎三種方案:優化

  1. 不使用.Net 4.6,繼續使用.Net 4.5

這三種方式中,雖然方法2和方法3能夠在使用.Net 4.6的前提下解決這個bug,但須要注意的是,因爲這個是.Net 4.6正式版的Bug,而JIT又是一種本地行爲,須要在全部執行你的程序的機器上都應用該修改,加上這個bug是很是隱晦的,不會立刻出錯,出錯也不必定知道是這兒出的錯。這兩種修改方式真正執行起來是很是困難的。spa

另外,在另外一篇blog中提到了幾個.Net 4.6的幾個bug:http://nickcraver.com/blog/2015/07/27/why-you-should-wait-on-dotnet-46/,看來,在生產環境中使用.Net 4.6還得掂量掂量了。調試

相關文章
相關標籤/搜索