Mozilla主導開發的通用程式語言Rust,推出了最新的1.45穩定版,這個版本有兩大重點,第一個是修復將大浮點數轉換成小整數,可能出現的未定義行為問題,另一個則是讓Rust熱門網頁開發框架Rocket,長期使用的Nightly功能進入穩定階段。

Rust 1.45這次修復的類別轉型問題,早在2013年10月就已經被發現了。由於rustc使用LLVM作為編譯器後端,當開發者在程式碼中使用強制轉換Cast函式時,底層其實是以LLVM的fptoui來實作強制轉換,fptoui是浮點數到無號整數(Floating Point To Unsigned Integer)的縮寫,而fptoui指令在部分情況可能產生有問題的值,當開發者將較大的浮點數,強制轉換成較小的整數,則將產生未定義的行為。

官方以下圖的例子解釋,在Rust 1.44中嘗試列印x:0,則可能列印出任意內容或是執行任意運算,但是在這個範例程式碼中,並沒有不安全的程式碼,官方提到,這就是他們把這個臭蟲命名為健全(Soundness)的原因,因為是編譯器執行了錯誤的處理,這個臭蟲之所以花了很長的時間才解決,是因為他們無法確定怎樣的解決方式才是正確的方向。

最後官方決定,在使用as的時候,將執行飽和強制轉換(Saturating Cast),而這將會把太大的浮點數,轉換成盡可能大的值,太小的浮點數則轉換成盡可能小的數值,而NaN則產生0。官方還提供了另一種方法,當開發者想要跳過檢查,也可以使用一組新加入的不安全強制轉換方法,不過官方提到,開發者應該把這個方法當作最後選擇,而且編譯器通常可以最佳化檢查程序,所以最終安全和不安全的版本效能是相同的。

Rust 1.45第二個更新重點,是能夠在更多地方使用類似函式程序的巨集,而這將連帶使得Rocket框架受惠。Rocket是2016年底發布的網頁框架,被稱作Rust生態系中必備的最佳框架,可在不犧牲彈性、可用性和類型安全的情況下,讓開發者快速開發出安全的網頁應用程式。

開發者在Rust 1.45中,可以於表示式(Expression)、模式(Pattern)和陳述式(Statement)位置呼叫巨集,這是一個提升開發方便性的調整,而Rocket也因此可以不再依靠Nightly功能,因為Rust 1.45,Rocket將不包含任何Rust的Nightly功能,使得Rocket進入更加穩定的階段。


熱門新聞

Advertisement