Adakah Kod C/C Anda Membuat Andaian Tidak Wajar?

Mary-Kate Olsen
Lepaskan: 2024-10-31 04:22:31
asal
337 orang telah melayarinya

 Is Your C/C   Code Making Unwarranted Assumptions?

Menunjukkan Andaian Tidak Wajar dalam C/C

Bagaimanakah alat pendidikan ini boleh diperbaiki?

Untuk meningkatkan keberkesanan alat ini, pertimbangkan cadangan berikut:

  • Sertakan kompilasi bersyarat: Gunakan kompilasi bersyarat untuk menguji andaian berdasarkan ciri platform tertentu. Contohnya, jika program ujian anda bergantung pada ciri bergantung pada platform tertentu, anda boleh menggunakan #ifdef atau #if __GNUC__ untuk menyesuaikan ujian kepada persekitaran pengkompil yang berbeza.
  • Kembangkan kes ujian: Sertakan pelbagai jenis kes ujian untuk merangkumi lebih banyak andaian biasa yang dibuat oleh pengaturcara. Contohnya boleh termasuk:

    • "Aritmetik titik terapung adalah bersekutu"
    • "Saiz lompang* adalah sama dengan saiz unit terkecil yang boleh dialamatkan"
    • "Tanda nombor negatif sentiasa -"
  • Automasikan ujian: Cipta skrip atau alat automatik untuk melaksanakan ujian dan kumpulkan keputusan merentasi platform yang berbeza. Ini akan menyelaraskan proses ujian dan memudahkan untuk mengekalkan pangkalan data perbezaan platform.

Ujian manakah yang bagus dan bagaimanakah rupanya?

1. Andaian Watak:

  • Ujian: Sahkan bahawa 'A' == 65 pada semua platform.
  • Kod:

    <code class="c">EXPECT("00 we have ASCII",('A'==65));</code>
    Salin selepas log masuk
    Salin selepas log masuk
  • Ujian: Semak sama ada andaian bahawa 'a' < 'A' adalah sah.
  • Kod:

    <code class="c">EXPECT("02 big letters come before small letters",('A'<'a'));
    Salin selepas log masuk
  • Ujian: Ujian jika saiz char sentiasa 8 bit.
  • Kod:

    <code class="c">EXPECT("04 a char is 8 bits",CHAR_BIT==8);
    Salin selepas log masuk

2. Andaian Integer:

  • Ujian: Periksa sama ada andaian bahawa integer menggunakan perwakilan pelengkap dua dan membungkus adalah sah.
  • Kod:

    <code class="c">EXPECT("06 integers are 2-complement and wrap around",(int_max+1)==(int_min));
    Salin selepas log masuk
  • Ujian: Semak sama ada penegasan bahawa saiz int adalah sama dengan saiz void* adalah benar pada semua platform.
  • Kod:

    <code class="c">EXPECT("05 int has the size of pointers",sizeof(int)==sizeof(void*));
    Salin selepas log masuk

3 . Andaian Penunjuk:

  • Ujian: Sahkan bahawa sizeof(void*) sentiasa lebih besar daripada atau sama dengan sizeof(void(*)()).
  • Kod:

    <code class="c">EXPECT("10 void* can store function pointers",sizeof(void*)>=sizeof(void(*)()));</li>
    </ul>
    <p><strong>4. Andaian Pelaksanaan:</strong></p>
    <ul>
    <li>
    <strong>Ujian:</strong> Uji jika tindanan sentiasa tumbuh ke bawah.</li>
    <li>
    <p><strong>Kod:</strong></p>
    <blockquote><pre class="brush:php;toolbar:false"><code class="c">EXPECT("12 the stack grows downwards",check_grow(5,0)<0);</code>
    Salin selepas log masuk
  • Ujian: Periksa andaian bahawa penilaian ungkapan sentiasa kiri ke kanan.
  • Kod:

    <code class="c">EXPECT("00 we have ASCII",('A'==65));</code>
    Salin selepas log masuk
    Salin selepas log masuk

Adakah anda akan menjalankan ujian pada platform yang anda boleh dapatkan dan menyiarkan keputusannya?

Kami menggalakkan penyertaan komuniti dalam menguji andaian pada platform yang berbeza. Sila kongsi keputusan anda bersama-sama dengan maklumat berikut:

  • Butiran platform (sistem pengendalian, versi pengkompil, seni bina)
  • Sebarang perbezaan yang diperhatikan daripada hasil yang dijangkakan
  • Mengapa perbezaan mungkin berlaku (cth., pengoptimuman pengkompil, pelaksanaan khusus platform)

Atas ialah kandungan terperinci Adakah Kod C/C Anda Membuat Andaian Tidak Wajar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!