สรุป :
ควรฟังก์ชั่นใน C ตรวจสอบอยู่เสมอเพื่อให้แน่ใจว่าไม่ได้อ้างอิงNULL
ตัวชี้? หากไม่เหมาะสมที่จะข้ามการตรวจสอบเหล่านี้
รายละเอียด :
ฉันได้อ่านหนังสือบางเล่มเกี่ยวกับการสัมภาษณ์การเขียนโปรแกรมและฉันสงสัยว่าระดับการตรวจสอบอินพุตที่เหมาะสมสำหรับอาร์กิวเมนต์ของฟังก์ชันใน C คืออะไร เห็นได้ชัดว่าฟังก์ชั่นใด ๆ ที่รับอินพุตจากผู้ใช้จำเป็นต้องทำการตรวจสอบความถูกต้องรวมถึงการตรวจสอบพอยน์เตอร์NULL
ก่อนที่จะทำการยกเลิกการอ้างอิง แต่ในกรณีของฟังก์ชั่นภายในไฟล์เดียวกันที่คุณไม่คาดว่าจะเปิดเผยผ่าน API ของคุณล่ะ
ตัวอย่างเช่นต่อไปนี้ปรากฏในซอร์สโค้ดของ git:
static unsigned short graph_get_current_column_color(const struct git_graph *graph)
{
if (!want_color(graph->revs->diffopt.use_color))
return column_colors_max;
return graph->default_column_color;
}
หาก*graph
เป็นNULL
ตัวชี้ Null จะถูกยกเลิกการพิจารณาอาจทำให้โปรแกรมขัดข้อง แต่อาจส่งผลให้เกิดพฤติกรรมที่คาดเดาไม่ได้อื่น ๆ ในทางกลับกันฟังก์ชั่นคือstatic
ดังนั้นโปรแกรมเมอร์อาจตรวจสอบอินพุตแล้ว ฉันไม่รู้ฉันเพิ่งเลือกแบบสุ่มเพราะมันเป็นตัวอย่างสั้น ๆ ในแอปพลิเคชันโปรแกรมที่เขียนใน C. ฉันเห็นสถานที่อื่น ๆ อีกหลายแห่งที่มีการใช้พอยน์เตอร์โดยไม่ตรวจสอบค่า NULL คำถามของฉันทั่วไปไม่เฉพาะเจาะจงกับส่วนรหัสนี้
ผมเห็นถามคำถามที่คล้ายกันในบริบทของการยกเว้นการมอบ อย่างไรก็ตามสำหรับภาษาที่ไม่ปลอดภัยเช่น C หรือ C ++ จะไม่มีการเผยแพร่ข้อผิดพลาดอัตโนมัติของข้อยกเว้นที่ไม่สามารถจัดการได้
ในทางกลับกันฉันเห็นโค้ดจำนวนมากในโครงการโอเพ่นซอร์ส (เช่นตัวอย่างด้านบน) ซึ่งไม่ได้ทำการตรวจสอบพอยน์เตอร์ใด ๆ ก่อนที่จะใช้ ฉันสงสัยว่าถ้าใครมีความคิดเกี่ยวกับแนวทางสำหรับเมื่อต้องวางการตรวจสอบในฟังก์ชั่นกับสมมติว่าฟังก์ชั่นที่ถูกเรียกด้วยข้อโต้แย้งที่ถูกต้อง
ฉันสนใจคำถามนี้โดยทั่วไปสำหรับการเขียนรหัสการผลิต แต่ฉันก็สนใจในบริบทของการสัมภาษณ์รายการ ตัวอย่างเช่นตำราอัลกอริทึมจำนวนมาก (เช่น CLR) มีแนวโน้มที่จะนำเสนออัลกอริทึมในนามแฝงโดยไม่มีการตรวจสอบข้อผิดพลาดใด ๆ อย่างไรก็ตามในขณะนี้เป็นสิ่งที่ดีสำหรับการทำความเข้าใจหลักของอัลกอริทึมก็เห็นได้ชัดว่าไม่ใช่วิธีการเขียนโปรแกรมที่ดี ดังนั้นฉันไม่ต้องการบอกผู้สัมภาษณ์ว่าฉันข้ามการตรวจสอบข้อผิดพลาดเพื่อทำให้ตัวอย่างโค้ดของฉันง่ายขึ้น (อาจเป็นตำราเรียน) แต่ฉันก็ไม่ต้องการที่จะสร้างรหัสที่ไม่มีประสิทธิภาพด้วยการตรวจสอบข้อผิดพลาดมากเกินไป ตัวอย่างเช่นgraph_get_current_column_color
อาจมีการแก้ไขเพื่อตรวจสอบ*graph
null แต่ไม่ชัดเจนว่าจะทำอย่างไรถ้า*graph
เป็นโมฆะอื่น ๆ นอกเหนือจากที่ไม่ควรตรวจสอบมัน