10
การ“ กำหนดค่าเริ่มต้นตัวแปรเสมอ” นำไปสู่ข้อบกพร่องสำคัญที่ถูกซ่อนอยู่หรือไม่
หลักเกณฑ์ C ++ Core มีกฎES.20: เริ่มต้นวัตถุเสมอ หลีกเลี่ยงข้อผิดพลาดที่ใช้ก่อนกำหนดและพฤติกรรมที่ไม่ได้กำหนดไว้ หลีกเลี่ยงปัญหาเกี่ยวกับความเข้าใจในการเริ่มต้นที่ซับซ้อน ลดความซับซ้อนของการ refactoring แต่กฎนี้ไม่ได้ช่วยในการค้นหาข้อบกพร่องมันเพียงซ่อนพวกเขา สมมติว่าโปรแกรมมีพา ธ การประมวลผลซึ่งใช้ตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้น มันเป็นข้อผิดพลาด พฤติกรรมที่ไม่ได้กำหนดไว้นอกจากนี้ยังหมายความว่ามีบางอย่างผิดปกติและโปรแกรมอาจไม่ตรงตามข้อกำหนดของผลิตภัณฑ์ เมื่อมันถูกนำไปใช้กับการผลิตอาจมีการสูญเสียเงินหรือแย่ลง เราจะตรวจสอบข้อบกพร่องได้อย่างไร เราเขียนแบบทดสอบ แต่การทดสอบไม่ครอบคลุมเส้นทางการดำเนินการ 100% และการทดสอบจะไม่ครอบคลุม 100% ของอินพุตโปรแกรม ยิ่งไปกว่านั้นแม้การทดสอบจะครอบคลุมเส้นทางการดำเนินการที่ผิดปกติ แต่ก็ยังสามารถผ่านได้ มันไม่ได้กำหนดพฤติกรรมหลังจากทั้งหมดตัวแปร uninitialized สามารถมีค่าที่ค่อนข้างถูกต้อง แต่นอกเหนือจากการทดสอบของเราเรามีคอมไพเลอร์ที่สามารถเขียนอะไรบางอย่างเช่น 0xCDCDCDCD ไปยังตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้น สิ่งนี้จะช่วยปรับปรุงอัตราการตรวจจับของการทดสอบเล็กน้อย ยิ่งไปกว่านั้น - มีเครื่องมือเช่น Address Sanitizer ที่จะอ่านค่าหน่วยความจำที่ไม่ได้กำหนดค่าเริ่มต้นทั้งหมด และในที่สุดก็มีเครื่องวิเคราะห์แบบสแตติกซึ่งสามารถดูโปรแกรมและบอกว่ามีการอ่านก่อนตั้งค่าบนพา ธ การเรียกใช้งานนั้น ดังนั้นเราจึงมีเครื่องมือที่ทรงพลังมากมาย แต่ถ้าเราเริ่มต้นตัวแปร - sanitizers ไม่พบอะไรเลย int bytes_read = …