ตัวอย่างโลกเรียล-โลกของ Arithmetic และหลุมใน C และ C+
Table of Contents
คณิตที่ชี้ไปยังตัวเลขนั้น เป็นคุณสมบัติทั่วไปใน C และ C+ ซึ่งอนุญาตให้มีการปรับเปลี่ยนที่อยู่หน่วยความจําโดยตรง ในขณะที่การใช้อย่างมีประสิทธิภาพ แต่ไม่ถูกต้องนั้น สามารถนําไปสู่ข้อผิดพลาดได้ ความอ่อนแอของความปลอดภัย และพฤติกรรมที่นิยามไม่ได้ บทความนี้แสดงทั้งตัวชี้ของโปรแกรมและข้อผิดพลาดของตัวชี้ตําแหน่ง
ตัว อย่าง 1: การ รับ ใช้ พระเจ้า
ตัว อย่าง เช่น เพื่อ รวม สมาชิก ใน จํานวนเต็ม เข้า ด้วย:
[FLT: 0] การใช้ตัวแบ่ง:
ผลรวม int = 0;
int *ptr=อาร์เรย์;
สําหรับ (int i = 0; i < ขนาด; i++)(*)
ผลรวม += * (ptr + i)
)
วิธีการนี้ จะใช้ข้อมูล RAW ได้อย่างถูกต้อง โดยใช้ตัวชี้ของข้อมูล
หลุม ที่ 1: จุด เริ่ม ต้น
การย้ายตัวชี้ของหน่วยความจําที่ขยายออกไป สามารถทําให้เกิดพฤติกรรมที่นิยามไม่ได้ได้ ตัวอย่างเช่น:
int *ptr=อาร์เรย์;
สําหรับ (int i = 0; i <=ขนาด; i++)(*)
printf ("%dn", *(ptr + i);
)
การเข้าถึง * (ptr + ขนาด) เกินขอบเขตอาร์เรย์ ซึ่งนําไปสู่ผลลัพธ์ที่คาดเดาไม่ได้
ตัว อย่าง 2: การ ทํา ให้ ไขว้ เขว
ตัวชี้คํานวณมักจะถูกใช้ในกระบวนการประมวลผลข้อความ ตัวอย่างเช่น การคัดลอกสตริง:
[FLT: 0] วิธีตัด:
Charl *src = "Helly"
character des[6];
อักขระ *p=rc;
Charlie=dest;
ในขณะที่ (p) {
*Q++ =* p++;
)
*Q =';
Pinkfall 2: Off-by-done มีข้อผิดพลาดในการคัดลอกสาย
การไม่จองพื้นที่สําหรับตัวป้อนคําว่าง หรือการคัดลอกเกินบัฟเฟอร์ทําให้เกิดการไหลล้น
charact [5];
ชาร์ *พ = "โลก"
สําหรับ (int i = 0; i < = 5; i++)(*)
ds[i] = p[i];
)
สําเนา 6 ตัวอักษรนี้ ออกมาเป็นสารบัฟเฟอร์ 5 ตัว ทําให้เกิดความล้นหลาม
รูปแบบการวน
การ เข้าใจ หลุม พราง ทั่ว ไป ช่วย ป้องกัน แมลง และ ปัญหา ด้าน ความ ปลอด ภัย ใน การ พัฒนา โปรแกรม.