Untuk Linux 5.18 ia dirancang untuk memindahkan kod ke versi C yang lebih terkini untuk menyelesaikan pelbagai masalah. 

Apakah Linux dan untuk apa ia?

Semasa proses perbincangan pembangun daripada kernel linux tentang danl tema satu set tampalan untuk membetulkan kelemahan Spectre dalam kod untuk berfungsi dengan senarai terpaut, ia menjadi jelas bagi banyak pemaju bahawa masalah boleh diselesaikan dengan lebih mudah jika dibenarkan dalam kod kernel C que mematuhi versi standard yang lebih baharu. 

Dan pada masa ini kod yang ditambahkan pada Linux Kernel mesti mematuhi spesifikasi ANSI C (C89), yang telah dibentuk pada tahun 1989.

Inilah sebabnya masalah yang berkaitan dengan Spectre dalam kod itu adalah kerana se terus menggunakan iterator ditakrifkan secara berasingan selepas gelung.

Walaupun sifatnya secara amnya pantas, projek kernel bergantung pada beberapa alat yang lebih lama. Walaupun pengkritik suka memberi tumpuan kepada penggunaan e-mel yang meluas oleh komuniti, anakronisme yang mungkin lebih ketara ialah penggunaan versi 1989 bagi standard bahasa C untuk kod kernel, piawaian yang telah dikodkan sebelum projek kernel bermula lebih 30 tahun yang lalu. Nampaknya amalan lama itu boleh ditamatkan sebaik sahaja kernel 5.18, dijangka pada Mei tahun ini.

Disebutkan bahawa makro digunakan untuk mengulangi elemen senarai terpaut, dan oleh kerana lelaran gelung diserahkan kepada makro ini, ia ditakrifkan di luar gelung itu sendiri dan kekal tersedia selepas gelung. Menggunakan standard C99 akan membolehkan pembangun mentakrifkan pembolehubah untuk gelung dalam blok for(), yang akan menyelesaikan masalah tanpa mencipta penyelesaian.

Malangnya, terdapat beberapa lokasi dalam kernel di mana senarai
iterator digunakan selepas gelung yang pecah pada perubahan sedemikian. Mujurlah
terdapat skrip use_after_iter.cocci yang boleh digunakan untuk mengenal pasti sedemikian
lokasi kod. Saya terpaksa menyesuaikan sedikit skrip kerana ia mengurangkan palsu
positif dalam kes penggunaan asal, tetapi itu berkaitan dengan tampung ini.

Pelbagai lokasi kod yang dilaporkan hanya menggunakan lelang senarai selepas
kitaran jika terdapat keluar awal (break/goto) dan oleh itu mereka tidak
relevan.

Bagi pihaknya, Linus Torvalds bersetuju dengan idea itu untuk dapat melaksanakan sokongan untuk spesifikasi yang lebih baru dan seterusnya mencadangkan beralih pada kernel 5.18 untuk menggunakan standard C11, yang dikeluarkan pada 2011.

Selepas itu, semasa pengesahan awal, pemasangan pada GCC dan Clang dalam mod baharu diluluskan tanpa sisihan. Melainkan masalah yang tidak diduga timbul akibat ujian yang lebih meluas, skrip binaan kernel 5.18 akan menukar pilihan '–std=gnu89' kepada '–std=gnu11 -Wno-shift-negative-value'.

Linus Torvalds tidak begitu menyukai tampalan itu dan tidak melihat bagaimana ia berkaitan dengan kelemahan pelaksanaan spekulatif. Bagaimanapun, selepas Koschel menjelaskan lebih lanjut keadaan itu, Torvalds bersetuju bahawa "ini hanyalah pepijat biasa, jelas dan mudah" dan berkata bahawa ia harus diperbaiki tanpa mengira siri yang lebih besar. Tetapi kemudian dia menyelidiki sumber sebenar masalah: bahawa lelaran yang dihantar ke senarai makro traversal mesti diisytiharkan dalam skop di luar gelung itu sendiri:

Sebab utama jenis ralat tidak spekulatif ini boleh berlaku ialah secara sejarah kami tidak mempunyai "pengisytiharan pembolehubah dalam gelung" gaya C99. Jadi list_for_each_entry() - dan semua yang lain - pada asasnya sentiasa menapis entri HEAD terakhir keluar daripada gelung, semata-mata kerana kami tidak dapat mengisytiharkan pembolehubah lelaran dalam gelung itu sendiri.

Perlu disebut juga bahawa kemungkinan menggunakan piawaian C17 telah dipertimbangkan, tetapi dalam kes ini adalah perlu untuk meningkatkan versi GCC yang disokong minimum, kerana kemasukan sokongan untuk C11 mematuhi keperluan semasa untuk versi GCC (5.1).

Akhirnya sekiranya anda berminat untuk mengetahui lebih lanjut mengenainya, anda boleh menyemak butiran di pautan berikut.


Tinggalkan komen anda

Alamat email anda tidak akan disiarkan. Ruangan yang diperlukan ditanda dengan *

*

*

  1. Bertanggungjawab untuk data: AB Internet Networks 2008 SL
  2. Tujuan data: Mengendalikan SPAM, pengurusan komen.
  3. Perundangan: Persetujuan anda
  4. Komunikasi data: Data tidak akan disampaikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Pangkalan data yang dihoskan oleh Occentus Networks (EU)
  6. Hak: Pada bila-bila masa anda boleh menghadkan, memulihkan dan menghapus maklumat anda.