ขณะนี้ฉันกำลังทำงานกับไลบรารีที่เขียนเป็น C ฟังก์ชันจำนวนมากของไลบรารีนี้คาดว่าจะมีสตริงเป็นchar*
หรือconst char*
ในอาร์กิวเมนต์ ฉันเริ่มต้นด้วยฟังก์ชั่นเหล่านั้นมักจะคาดหวังความยาวของสตริงsize_t
เพื่อไม่ให้มีการยกเลิกค่า null อย่างไรก็ตามเมื่อเขียนการทดสอบสิ่งนี้ส่งผลให้มีการใช้งานบ่อยstrlen()
เช่น:
const char* string = "Ugh, strlen is tedious";
libFunction(string, strlen(string));
การวางใจให้ผู้ใช้ส่งผ่านสายอักขระที่ถูกยกเลิกอย่างถูกต้องจะนำไปสู่ความปลอดภัยที่น้อยลง แต่มีความรัดกุมมากกว่าและ (ในความคิดของฉัน) รหัสที่อ่านได้:
libFunction("I hope there's a null-terminator there!");
ดังนั้นการปฏิบัติที่เหมาะสมที่นี่คืออะไร? ทำให้ API มีความซับซ้อนมากขึ้นในการใช้งาน แต่บังคับให้ผู้ใช้นึกถึงการป้อนข้อมูลหรือบันทึกข้อกำหนดสำหรับสตริงที่สิ้นสุดด้วยค่า null และเชื่อใจผู้โทร
CreateFile
รับLPTCSTR lpFileName
พารามิเตอร์เป็นอินพุต ไม่คาดหวังความยาวของสตริงจากผู้เรียก ในความเป็นจริงการใช้สตริงที่ถูกยกเลิก NUL นั้นฝังอยู่ในเอกสารไม่ได้กล่าวถึงว่าชื่อไฟล์จะต้องถูกยกเลิกด้วย NUL (แต่แน่นอนว่ามันต้องเป็น)