對於 Linux 5.18,計劃將代碼移動到更新的 C 版本以解決各種問題。 

什麼是 Linux,它有什麼用途?

過程中 開發者討論 Linux內核 關於e一組的主題 修復漏洞的補丁 代碼中的 Spectre 與鍊錶一起使用, 事情變得清楚了 對於許多開發者來說這個問題 如果可以更容易地解決 允許在內核代碼中使用 C que 符合較新版本的標準。 

目前添加到 Linux 內核的代碼必須符合 89 年制定的 ANSI C (C1989) 規範。

這就是原因 與幽靈相關的問題 代碼中是因為 se 一直使用迭代器 在循環之後單獨定義。

儘管內核項目通常速度很快,但它是基於許多舊工具的。 雖然批評者喜歡關注社區對電子郵件的廣泛使用,但一個可能更重要的不合時宜之處是對內核代碼使用 1989 年版本的 C 語言標準,該標準是在 30 多年前內核項目開始之前就已編成的。 看起來這種長期的做法可能會在內核 5.18 時結束,預計在今年 XNUMX 月份發布。

有人提到 宏用於迭代鍊錶的元素, 並且由於循環迭代器被傳遞給該宏,因此它是在循環本身之外定義的,並且在循環之後仍然可用。 使用 C99 標準將允許開發人員在 for() 塊中定義循環變量,這將解決問題而無需發明解決方法。

不幸的是,內核中有幾個位置存放該列表
迭代器在因此類更改而中斷的循環之後使用。 幸運的是
有 use_after_iter.cocci 腳本可用於識別此類
代碼位置。 我必須稍微調整一下腳本,因為它可以減少 false
原始用例中的積極因素,但這些與此補丁相關。

大量報告的代碼位置僅在之後使用列表迭代器
如果有提前退出(break/goto),則循環,因此它們不是
相關的。

就其本身而言, 萊納斯·托瓦茲同意這個想法。 為了能夠實現對新規範的支持,並進一步建議在內核 5.18 中移動以使用 11 年發布的 C2011 標準。

之後,在預檢期間,在新模式下安裝 GCC 和 Clang 都順利通過,沒有出現任何偏差。 除非由於更廣泛的測試而出現不可預見的問題,否則 5.18 內核構建腳本會將“–std=gnu89”選項更改為“–std=gnu11 -Wno-shift-negative-value”。

Linus Torvalds 不太喜歡這個補丁,也看不出它與推測執行漏洞有何關係。 然而,在科舍爾進一步解釋情況後,托瓦茲同意“這只是一個正常的錯誤,簡單明了”,並表示無論更大的系列如何,都應該修復它。 但隨後他深入研究了問題的真正根源:傳遞給列表遍歷宏的迭代器必須在循環本身之外的範圍內聲明:

發生這種非推測性錯誤的主要原因是歷史上我們沒有 C99 風格的“在循環中聲明變量”。 因此 list_for_each_entry() - 以及所有其他方法 - 從根本上總是將最後一個 HEAD 條目過濾出循環,僅僅是因為我們無法在循環本身中聲明迭代器變量。

還值得一提的是 考慮了使用 C17 標準的可能性, 但在這種情況下,有必要增加 GCC 的最低支持版本,因為包含對 C11 的支持符合 GCC 版本 (5.1) 的當前要求。

終於 如果您有興趣了解更多信息,您可以在中查看詳細信息 以下鏈接。


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責資料:AB Internet Networks 2008 SL
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。