Wednesday, July 15, 2015

Aliasing และ Dangling Reference

Aliasing และ Dangling Reference

Aliasing คือ การอ้างอิงไปยังเมมโมรีตำแหน่งหนึ่ง ที่สามารถกระทำได้ด้วยตัวแปร (identifier) มากกว่า 1 ตัวแปรขึ้นไป
ปัญหา Aliasing มักเกิดจากการใช้งานพอยน์เตอร์โดยไม่ระวัง  หากไม่เข้าใจก็จะทำให้เสียเวลาหา bug ในโปรแกรมมากขึ้นเช่น

1. | int  a; 
2. | int *b;
3. | a = 10;
4. | b = &a;
5. | a = 20;
6. | printf (“%d  %d\n”, a, *b);
7. | *b = 30;
8. | printf (“%d  %d”, a, *b);
9. | a  = a  +  80; 

จากโค้ด
บรรทัดที่ 5 พอยน์เตอร์ b จะชี้ไปยังตำแหน่งที่ตัวแปร a อยู่
บรรทัดที่ 6 เมื่อ a มีค่าเท่ากับ 20 ก็พลอยทำให้ค่าที่พอยน์เตอร์ b ชี้คือ 20
บรรทัดที่ 7 แสดงผลลัพธ์จะได้ผลลัพธืเหมือนกันคือ a = 20 คือของพอยน์เตอร์ b ชี้ไปคือ 20 เช่นกัน
บรรทัดที่ 8 ค่าที่พอยน์เตอร์ชี้  ในที่นี้ยังอยู่ตำแหน่งเดิมคือตำแหน่งที่ a อยู่ ถูกแก้ไขเป็น 30
บรรทัดที่ 9 แสดงผลลัพธ์จะได้ผลลัพธืเหมือนกันคือ a = 20 คือของพอยน์เตอร์ b ชี้ไปคือ 30 เช่นกัน

จะเห็นว่าโปรแกรมเมอร์ต้องเข้าใจว่าเมื่อมีการแก้ไขค่าของ a หรือ ค่าที่พอยน์เตอร์อ้างอิงจะมีผลกระทบต่อกันเสมอ

สมมติว่าโปรแกรมเมอร์เขียนโปรแกรมถึงบรรทัดที่ 10 จะเข้าใจว่า a = 20 ตามโค้ดที่ตัวเองเขียน  ซึ่งอันที่จริงแล้ว a ถูกแก้ไปเป็น 30 แล้วจาดบรรทัดที่ 8  ดังนั้นผลลัพธ์ที่เกิดขึ้นคือ  a = 110 ไม่ใช่ a = 100 ตามที่ตนเองเข้าใจจากการอ่านโค้ด

Dangling Reference 
Dangling Reference คือปัญหาที่เกิดจากการใช้งานพอยน์เตอร์ทั้งที่ตำแหน่งที่พอยน์เตอร์ชี้นั้นไม่มีอยู่แล้วในเมมโมรี   ปัญหานี้สืบเนื่องต่อจาก Aliasing นั่นเอง
เช่น

1.  |   int  a; 

2.  |   int *b;

3.  |   a = 10;

4.  |   b = &a;

5.  |   a = 20;

6.  |   printf (“a=%d  b=%d a_addr = %x b_addr = %x \n”, a, *b, &a, b);
7.  |   b = NULL; //pointer b points to nothing.

8.  |   printf (“a=%d  b=%d a_addr = %x b_addr = %x ”, a, *b, &a, b);
9.  |   *b = 40;     //Dangling reference 
10.|   printf (“a=%d  b=%d a_addr = %x b_addr = %x ”, a, *b, &a, b);

บรรทัดที่ 4   พอยน์เตอร์ b จะชี้ไปที่ตำแหน่งที่ตัวแปร a อยู่ในเมมโมรี
บรรทัดที่ 5  เมื่อกำหนด a = 20 จะมีผลต่อค่าข้อมูลที่พอยน์เตอร์ชี้ตามไปด้วย
บรรทัดที่ 6  ทั้ง a และ *b ค่าเท่ากันคือ 20 และมีตำแหน่งในเมมโมรีที่อ้างอิงเป็นตำแหน่งเดียวกัน
บรรทัดที่ 7 กำหนด Null pointer คือลบการอ้างอิงของพอยน์เตอร์ออกไป  หรือพอยน์เตอร์ b ณ ขณะนี้ไม่ได้อ้างอิงไปยังเมมโมรีอีกแล้ว
บรรทัดที่ 8 ค่าที่พอยน์เตอร์ b ชี้ (*b) คือ 0 และไม่มีตำแหน่งที่พอยน์เตอร์ชี้อีกแล้ว ตำแหน่งของ a ยังอยู่ที่เดิม แต่ตำแหน่งของ b ไม่มีแล้ว
บรรทัดที่ 9 การกำหนดค่าที่พอยน์เตอร์ชี้ *b = 40 จะเกิด Error คือ Non pointer reference ถึงแม้ว่าบรรทัดที่ 10 *b จะมีค่าเป็น 40 แต่ตำแหน่งของ b ไม่มีแล้ว    และการแก้ไขค่าผ่านพอยน์เตอร์ b ไม่มีผลต่อพอยน์เตอร์ a ดังนั้น a ยังเป็น 20 (ค่าที่แก้ไขล่าสุดในบรรทัดที่ 5)



No comments:

Post a Comment