Rumah >pembangunan bahagian belakang >C++ >Apakah Potensi Bahaya Menggunakan Rentetan Format `printf` yang tidak sah?
Apakah Potensi Akibat Menggunakan Rentetan Format printf yang tidak sah?
Pertimbangkan coretan kod berikut:
#include <iostream> #include <cstdio> int main() { std::cout << sizeof(int) << std::endl << sizeof(long) << std::endl; long a = 10; long b = 20; std::printf("%d, %d\n", a, b); return 0; }
Apabila dilaksanakan pada seni bina 32-bit, ia menghasilkan perkara berikut output:
4 4 10, 20
Pada seni bina 64-bit, ia menghasilkan:
4 8 10, 20
Dalam mana-mana kes, program mencetak hasil yang dijangkakan. Walau bagaimanapun, bagaimana jika kami secara tidak sengaja menggunakan rentetan format yang salah?
Kesan Yang Tidak Ditakrifkan
Jawapannya mudah tetapi membingungkan: apa-apa boleh berlaku. Menggunakan rentetan format yang tidak sah membentuk Gelagat Tidak Ditakrifkan. Mengikut takrifan, Tingkah Laku Tidak Ditakrifkan bermaksud bahawa hasilnya tidak dapat diramalkan sepenuhnya dan mungkin berbeza-beza.
Piawaian C99, seksyen 7.19.6.1, perenggan 9, secara eksplisit menyatakan bahawa "Jika spesifikasi penukaran tidak sah, tingkah laku itu tidak ditentukan . Jika mana-mana hujah bukan jenis yang betul untuk spesifikasi penukaran yang sepadan, tingkah lakunya adalah undefined."
Oleh itu, memanggil printf dengan rentetan format yang tidak sah boleh membawa kepada pelbagai hasil yang berpotensi, termasuk:
Akibat yang tepat bergantung pada banyak faktor, termasuk rentetan format khusus yang digunakan, hujah yang diluluskan dan pengkompil serta platform yang digunakan. Pendek kata, apa sahaja boleh berlaku dan satu-satunya sebab untuk menyalahkan diri sendiri.
Untuk mengelakkan hasil yang tidak dapat diramalkan ini, adalah penting untuk memastikan rentetan format yang digunakan dalam printf dan fungsi pemformatan lain sentiasa sah.
Atas ialah kandungan terperinci Apakah Potensi Bahaya Menggunakan Rentetan Format `printf` yang tidak sah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!