Endurecimiento de la biblioteca estándar en C++26: contratos frente a comportamiento indefinido

Fuentes: C++26: Standard Library Hardening Experiments

El estándar C++26 introduce el concepto de implementación «endurecida» (hardened) para la biblioteca estándar, un mecanismo que busca sustituir el comportamiento indefinido (UB) de operaciones como el acceso fuera de rango por violaciones de contrato con semántica de terminación. Hasta C++26, expresiones como std::vector::operator[] provocaban UB si el índice quedaba fuera de tamaño; desde C++26, en una implementación endurecida, esa misma situación genera una violación de contrato que detiene la ejecución en lugar de permitir accesos inseguros a memoria. El endurecimiento no convierte operator[] en .at() —la excepción frente a la terminación es una decisión deliberada— y se apoya en el nuevo modelo de Contratos aprobado también para C++26.

El artículo explica cómo activar la función en los principales compiladores: en GCC/libstdc++ basta con _GLIBCXX_ASSERTIONS (activo por defecto sin optimización) o el flag -fhardened; en Clang/libc++ se usa _LIBCPP_HARDENING_MODE con niveles NONE, FAST, EXTENSIVE y DEBUG; y en MSVC STL, _MSVC_STL_HARDENING=1 con macros específicas por tipo como _MSVC_STL_HARDENING_VECTOR. Las propuestas P3471, P3697 y P3878 detallan las condiciones endurecidas, que afectan a contenedores secuenciales, vistas, adaptadores de iteradores, cadenas, smart pointers, bitset, optional y expected, entre otros. Un ejemplo en Compiler Explorer con GCC 16.1 muestra cómo, incluso sin habilitar endurecimiento explícito, las aserciones de libstdc++ detienen el programa con SIGSEGV al acceder fuera de rango, ilustrando el cambio de paradigma hacia la detección temprana de errores.