คณิตที่ชี้ไปยังตัวเลขนั้น เป็นคุณสมบัติทั่วไปใน 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 ตัว ทําให้เกิดความล้นหลาม

รูปแบบการวน

การ เข้าใจ หลุม พราง ทั่ว ไป ช่วย ป้องกัน แมลง และ ปัญหา ด้าน ความ ปลอด ภัย ใน การ พัฒนา โปรแกรม.