GNU/Linux >> Belajar Linux >  >> Linux

Apakah Ada Kompilator atau Runtime C yang "esoterik" (aneh) Tapi Sesuai Standar?

Seperti yang kita ketahui, standar C tidak menentukan banyak detail implementasi, misalnya nilai pointer NULL, urutan bit dan byte (endiannes), penyelarasan dalam struct dan parameter tumpukan, organisasi memori yang sebenarnya (saya tidak tahu). t berpikir tata letak tumpukan diperlukan sama sekali, hanya "otomatis").
Selain itu, beberapa bagian lain malah didefinisikan (atau tidak ditentukan) untuk menghasilkan perilaku yang tidak ditentukan, seperti dereferencing null (biasanya segfault tetapi tidak harus)

Karena platform modern (atau terserah kompiler?) (sengaja?) berperilaku serupa, beberapa perilaku program yang konsisten sebenarnya berbahaya untuk diandalkan.

Jadi, apakah ada varian unix atau platform yang terinspirasi unix, (atau kompiler jika sebagian besar terserah kompiler?) yang standar tetapi sengaja aneh untuk menghasilkan bug dan menunjukkan perilaku yang tidak terdefinisi dan unportabilitas?
Apakah serupa hal yang ada tetapi untuk POSIX bukan C? Apakah masuk akal untuk mencoba dan menerapkannya?

Jawaban yang Diterima:

HP-UX Hewlett Packard adalah yang paling dekat yang dapat saya pikirkan.

Kompiler C akan mengizinkan dereferensi NULL-pointer, meskipun ada tanda untuk mengubahnya. Tumpukan bertambah “naik” (menuju alamat yang lebih besar) dan tumpukan bertambah (menuju alamat yang lebih kecil) pada perangkat keras PA-RISC.

Perangkat keras PA-RISC juga memiliki beberapa keanehan di luar pembalikan tumpukan/tumpukan. Itu memiliki register segmen (bekerja secara berbeda dari segmen x86) sehingga berbagai perpustakaan benar-benar tinggal di segmen yang berbeda, dan pointer-to-functions bukanlah pointer 64-bit tunggal. Namun, saya tidak ingat apakah PA-RISC seketat penyelarasan pointer seperti SPARC.

Pada tingkat yang lebih tersedia, Anda dapat menggunakan kompiler C seperti Dentang, Pcc atau bahkan Tcc, meskipun Tcc memiliki beberapa masalah dengan tautan dan pemuat GNU karena "simbol lemah" seperti yang saya pahami. Paling tidak, Anda akan mendapatkan pesan peringatan yang berbeda dari kompiler alternatif ini, yang selalu bermanfaat.

Anda juga dapat mencoba pustaka C alternatif, seperti Diet Libc atau Musl. Saya memiliki kode yang melakukan hal yang berbeda ketika dikompilasi terhadap Musl sebagai lawan dari GNU Libc. Kedua perpustakaan ini mendukung penautan statis, yang membuat GNU Libc sulit atau tidak mungkin. Musl bahkan memiliki sistem penautan dinamis yang sangat berbeda, yang mungkin mengekspos bug laten dalam kode Anda.

Terkait:Ubuntu – Bagaimana agar pam_exec menjalankan skrip sebagai pengguna saat ini?
Linux
  1. N Setara Dengan Top Tapi Untuk Jaringan I/o?

  2. Apakah ada kode status keluar standar di Linux?

  3. Ubuntu Command 'pip' tidak ditemukan, tetapi ada 18 yang serupa

  1. Apakah ada perintah linux seperti mv tetapi dengan regex?

  2. Apakah ada alternatif untuk menggunakan `udev`?

  3. mengapa timer_t didefinisikan dalam time.h di Linux tetapi tidak pada OS X

  1. Apakah Ada Konvensi Penamaan Untuk Variabel Dalam Skrip Shell?

  2. Uji Apakah Ada File Yang Cocok Dengan Pola Untuk Mengeksekusi Skrip?

  3. Mengapa ada `/lib` dan `/lib64` tetapi hanya `/bin`?