Swift 5將強制執行記憶體獨佔訪問

2021-09-16 18:58:40 字數 1383 閱讀 1875

swift 5將帶來改進的swift程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。這個變更對現有應用程式的行為和swift編譯器本身都有重要影響。

swift 5將帶來改進的swift程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。這個變更對現有應用程式的行為和swift編譯器本身都有重要影響。

在多種情況下會發生獨佔記憶體訪問問題。編譯器可以靜態地捕獲大部分問題,剩下的只能在執行時處理。只能在執行時處理的問題包括具有轉義閉包、類型別屬性、靜態屬性和全域性變數的排他性違規。

為了更好地說明這個問題,我們可以考慮乙個相當普遍的情況:修改乙個函式的inout變數,這個函式執行了乙個閉包,這個閉包使用同一作用域內的兩個不同的名稱訪問上述的變數:

func modifytwice(_ value: inout int, by modifier: (inout int) -\u0026gt; ()) func testcount()   print(count)}
在這個例子中,因為使用count同時作為modifytwice和modifier的inout引數,所以出現了問題。我們不清楚print語句應該列印出什麼內容。第一次count變數遞增,它的值遞增到2。但是,當執行第二次加法時,要新增到$0的count值是多少?這可能取決於很多因素,因為記憶體操作不一定是瞬時的。更糟糕的是,編譯器可能會引入優化,進一步使這種情況複雜化。

這個問題不僅與通過不同變數名同時修改記憶體的不可**性有關,也與編譯器的複雜性有關。

這可能會導致意外和混亂的結果。它還導致編譯器和標準庫的實現具有很大的保守性,它們通常必須確保程式的基本可靠性(沒有崩潰或未定義的行為),即使是在不尋常的情況下。

所有這些意味著如果發現獨佔訪問衝突,使用swift 5編譯器編譯的應用程式將在執行時崩潰。這個行為以前在swift 4編譯器除錯模式下可用,因此,僅在執行時模式下測試過的程式在使用swift 5編譯時有崩潰的風險。

swift 4編譯器可用,因此僅在執行時模式下測試的程式在使用swift 5編譯時可能會崩潰。

修復訪問獨佔違規的一般方法是複製資料。在我們的示例中,這將歸結為:

func modifytwice(_ value: inout int, by modifier: (inout int) -\u0026gt; ()) func testcount()   print(count)}
實際上,訪問獨佔違規檢查可能會被禁用,但強烈建議不要這樣做:

雖然禁用執行時檢查可能可以解決效能問題,但這並不意味著獨佔違規是安全的。如果沒有啟用強制執行,程式設計師必須遵守獨佔規則。

檢視英文原文:

Swift 5將強制執行記憶體獨佔訪問

swift 5將帶來改進的swift程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。這個變更對現有應用程式的行為和swift編譯器本身都有重要影響。swift 5將帶來改進的swift程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。...

Swift 5將強制執行記憶體獨佔訪問

swift 5將帶來改進的swift程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。這個變更對現有應用程式的行為和swift編譯器本身都有重要影響。swift 5將帶來改進的swift程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。...

Swift 5將強制執行記憶體獨佔訪問

swift 5將帶來改進的swift程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。這個變更對現有應用程式的行為和swift編譯器本身都有重要影響。swift 5將帶來改進的swift程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。...