C++26: ทดลองโหมด Hardening ของ Standard Library เปลี่ยน undefined behavior ให้จับได้
C++26: Standard Library Hardening Experiments

บทความจาก C++ Stories ที่อัปเดตเมื่อวันที่ 30 สิงหาคม 2026 อธิบายฟีเจอร์สำคัญของ C++26 ที่เรียกว่า “hardened implementation” ซึ่งเปลี่ยนพฤติกรรมของไลบรารีมาตรฐานจากที่เคยเป็น undefined behavior เมื่อมีการละเมิดเงื่อนไขเบื้องต้น (precondition) ให้กลายเป็นการละเมิดสัญญา (contract violation) ที่ตรวจจับได้และหยุดการทำงานทันที
ตัวอย่างที่ชัดที่สุดคือ std::vector::operator[] ซึ่งเดิมไม่มีการตรวจสอบขอบเขต หากเข้าถึงดัชนีที่เกินขนาดก็จะเกิด undefined behavior ที่อาจทำให้ข้อมูลเสียหายอย่างเงียบ ๆ แต่ในโหมด hardened การเข้าถึงดัชนี 100000 บน vector ที่มีเพียง 3 สมาชิก จะทำให้โปรแกรมยุติการทำงานพร้อมข้อความวินิจฉัยแทน
การเปิดใช้งานแตกต่างกันไปตามคอมไพเลอร์ สำหรับ GCC/libstdc++ ใช้ _GLIBCXX_ASSERTIONS หรือแฟล็ก -fhardened, สำหรับ Clang/libc++ ใช้ _LIBCPP_HARDENING_MODE ซึ่งเลือกได้สี่ระดับคือ NONE, FAST, EXTENSIVE และ DEBUG ส่วน MSVC STL ใช้ _MSVC_STL_HARDENING=1 พร้อมควบคุมได้รายชนิดข้อมูล
ด้านผลกระทบต่อประสิทธิภาพ บทความระบุว่าการตรวจสอบเหล่านี้ทำงานในเวลาคงที่และมี overhead ค่อนข้างน้อย ซึ่งเป็นเหตุผลที่ทำให้เหมาะกับการเปิดใช้แม้ในโหมด release สำหรับโค้ดที่ต้องการความปลอดภัย
ฟีเจอร์นี้เป็นส่วนหนึ่งของทิศทางใหญ่ของ C++26 ที่ผลักดันเรื่องความปลอดภัยของหน่วยความจำโดยไม่บังคับให้เขียนโค้ดใหม่ทั้งหมด ควบคู่กับฟีเจอร์อื่น ๆ อย่าง reflection และ contracts ซึ่งเป็นคำตอบของภาษา C++ ต่อแรงกดดันจากภาษาที่ปลอดภัยด้านหน่วยความจำอย่าง Rust