Fil-C ialah pengkompil untuk bahasa C dan C++ yang menjamin operasi selamat dengan memori

Pada persidangan SPLASH'24, Filip Pizlo mempersembahkan pengkompil C/C++ terbuka Fil-C, yang memberikan perlindungan terhadap masalah yang disebabkan oleh ralat semasa bekerja dengan memori. Projek ini bertujuan untuk memastikan keserasian penuh dengan kod sedia ada dalam bahasa C dan C++ - untuk memastikan operasi selamat dengan memori, cukup dengan membina semula kod sedia ada. Pengkompil dibina menggunakan komponen daripada projek LLVM dan diedarkan di bawah lesen Apache 2.0. Runtime dibekalkan di bawah lesen BSD. Tidak seperti projek TrapC yang diumumkan baru-baru ini, yang masih dalam fasa reka bentuknya, pengkompil Fil-C sudah bersedia untuk membina kod sedia ada.

Projek ini juga menyediakan versi selamat memori bagi perpustakaan C standard (libc) dan C++ (libc++), berdasarkan perpustakaan Musl dan LLVM libc++. Antara lain, program yang dibina mungkin menggunakan ciri seperti multithreading, pemprosesan isyarat, pemetaan memori (mmap), longjmp/setjmp, dan pengendalian pengecualian dalam C++. Menggunakan projek Fil-C, bzip2, zip, pcre dan ncurses boleh dibina tanpa membuat sebarang perubahan. Dengan pengubahsuaian kecil, ia menyokong membina OpenSSH, OpenSSL, CPython, SQLite, Lua, Curl, Lynx, jpeg6b, zsh, xzutils dan simdutf.

Perlindungan terhadap masalah ingatan disediakan dengan penggunaan penuding MonoCaps 128-bit dengan metadata untuk pemeriksaan jenis dan penjejakan sempadan penimbal, serta penggunaan pemungut sampah FUGC, yang mengawal semua peruntukan memori dan operasi deallocation. Sekiranya berlaku ralat semasa bekerja dengan memori, aplikasi itu serta-merta ranap, yang tidak membenarkan mengeksploitasi kemungkinan kelemahan.

Dinyatakan bahawa gabungan MonoCaps dan FUGC membolehkan anda menangkap dan menyekat semua ralat yang berkaitan dengan melangkaui sempadan penimbal pada timbunan dan timbunan, mengakses memori yang sudah dibebaskan, keadaan perlumbaan apabila bekerja dengan penunjuk, serta pengendalian jenis yang salah ( Kekeliruan Taip) dalam persilangan konteks jenis penuding dan bukan penuding, masalah dengan pemautan dinamik dan penggunaan va_lists yang salah. Di samping itu, Fil-C secara berasingan menyemak sempadan dan jenis dalam penimbal yang dihantar kepada panggilan sistem.

Kos penggunaan Fil-C untuk melindungi projek sedia ada tanpa menulis semula kodnya atau menggunakan binaan bahasa khas merupakan penalti prestasi. Pada peringkat pembangunan semasa, program yang dikompilasi dalam Fil-C adalah kira-kira 1.5-5 kali lebih perlahan daripada yang dikompilasi dengan pengkompil konvensional. Kerja pengoptimuman dirancang. Dijangkakan bahawa selepas kerja ini selesai, pelaksanaan kod akan menjadi 1.2 kali lebih perlahan dalam kebanyakan kes, dan dalam senario terburuk, kelembapan tidak akan melebihi 1.5 kali. Pengkompil pada masa ini hanya menyokong platform [Tidak Berkaitan]. Linux pada sistem X86_64. Versi terdahulu disokong macOS dan FreeBSD, tetapi kemudian diputuskan untuk tidak menyebarkan usaha dan terlebih dahulu menyediakan port libc berkualiti tinggi untuk satu platform.

Satu lagi had Fil-C ialah keengganan asas untuk mengekalkan keserasian pada tahap ABI untuk kod C/C++, yang tidak membenarkan kod yang disusun dalam Fil-C untuk dipautkan dengan perpustakaan dan fail objek yang disusun oleh penyusun lain. Kaedah memanggil fungsi dan cara memaut dinamik dalam Fil-C berbeza daripada penyusun dan pemaut sedia ada. Keputusan ini dijelaskan oleh fakta bahawa apabila memautkan dengan kod yang tidak dilindungi, intipati perlindungan yang ditawarkan dalam Fil-C hilang dan ilusi aplikasi yang dilindungi timbul - dengan keserasian ABI, pembangun akan tergoda untuk mengumpul hanya fail individu dalam Fil -C, tanpa mengganggu diri mereka sendiri dengan mengalihkan keseluruhan projek .

Mekanisme MonoCap Fil-C adalah berdasarkan penggunaan penunjuk 16-bait, yang, sebagai tambahan kepada alamat memori, menunjukkan rujukan kepada objek yang merangkumi maklumat tentang keupayaan, seperti sempadan atas dan bawah penimbal yang dikaitkan dengan penunjuk, serta tatasusunan , mentakrifkan jenis data yang disimpan dalam setiap blok memori (1 bait dengan maklumat jenis (tidak ditetapkan, int, ptr, percuma) untuk setiap blok memori 16 bait). Setiap kali memori diakses oleh penunjuk, sempadan dan jenis disemak (contohnya, data dengan jenis "int" tidak boleh ditulis ke memori dengan jenis "ptr" dan sebaliknya).

Semua operasi peruntukan memori dan deallocation diproses oleh Unbelievable Garbage Collector (FUGC) Fil, yang, apabila memori dibebaskan, menetapkan semua jenis rekod yang dikaitkan dengan penimbal yang dibebaskan kepada nilai "percuma" dan kemudian mengalihkan semua penunjuk ke objek yang dibebaskan ke objek berasingan menandakan bahawa ingatan telah dibebaskan. Sebarang akses lanjut kepada blok data dengan jenis "percuma" atau kepada penuding yang dikaitkan dengan objek yang dibebaskan menghasilkan penjanaan pengecualian, yang membenarkan perlindungan terhadap kelemahan penggunaan selepas bebas. Pengumpul sampah berjalan selari dan tidak menjeda pelaksanaan benang lain.

Menggunakan gabungan MonoCaps dan FUGC membolehkan anda mengekalkan keupayaan untuk bekerja dengan penunjuk seperti biasa dan membiarkan semantik malloc dan panggilan percuma tidak berubah, sambil memberikan perlindungan yang terjamin. Kod program mungkin mengandungi pelbagai ralat logik, seperti hantaran jenis yang salah, aritmetik penunjuk yang salah, keadaan perlumbaan dan panggilan yang tidak tepat pada masanya ke free(), tetapi tanpa mengira semua ini, Fil-C akan mengingati sempadan asal dan jenis data, dan membatalkan pelaksanaan . jika percubaan dibuat untuk mengakses penuding ke kawasan di luar sempadan yang diingati, mengakses blok memori yang dibebaskan atau membaca data jenis "int" sebagai penunjuk atau sebaliknya.

Penulis Fil-C, Philip Pizlo, ialah pengarah projek bahasa pengaturcaraan di Epic Games. Philip mempunyai pengalaman luas dalam mengusahakan mesin maya, bahasa pengaturcaraan, pengkompil dan pengumpul sampah. Contohnya, di IBM, beliau membangunkan bahasa pengaturcaraan X10; di Microsoft, beliau mengusahakan pengumpul sampah Stopless, Clover dan Chicken; di Apple, beliau mengusahakan pengkompil JIT dan pengoptimuman untuk enjin pelayar WebKit; dan di Epic Games, beliau mengetuai pasukan pembangunan yang membangunkan bahasa pengaturcaraan Verse dan mesin maya yang berkaitan dengannya. Philip juga merupakan pembangun utama. mesin maya Jikes RVM, Ovm dan Fiji VM.

Mainkan video


Sumber: opennet.ru
Beli pengehosan yang boleh dipercayai untuk tapak dengan perlindungan DDoS, pelayan VPS VDS 🔥 Beli pengehosan laman web yang boleh dipercayai dengan perlindungan DDoS, pelayan VPS VDS | ProHoster