Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Kod C/C Anda Membuat Andaian Tidak Wajar?

Adakah Kod C/C Anda Membuat Andaian Tidak Wajar?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-31 04:22:31414semak imbas

 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>
  • Ujian: Semak sama ada andaian bahawa 'a' < 'A' adalah sah.
  • Kod:

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

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

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));
  • 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*));

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>
  • Ujian: Periksa andaian bahawa penilaian ungkapan sentiasa kiri ke kanan.
  • Kod:

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

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!

Kenyataan:
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