您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關.NET 4.6的RyuJIT編譯器中發現嚴重的Bug是怎樣的,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
來自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#示例代碼。微軟目前還沒有說明這個補丁的發布日期。
以上就是.NET 4.6的RyuJIT編譯器中發現嚴重的Bug是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。