C++26 Hardening: как превратить неопределённое поведение в контролируемый сбой
C++26: Standard Library Hardening Experiments

В C++26 появилось понятие «усиленной» (hardened) стандартной библиотеки: ряд предусловий, нарушение которых раньше приводило к неопределённому поведению, теперь проверяется и завершает программу. Статья объясняет суть нововведения на примере std::vector::operator[], разбирает ключевые предложения P3471, P3697 и P3878, показывает, как включить режим в GCC, Clang и MSVC, и оценивает влияние на производительность. Автор подчёркивает, что усиление не делает C++ полностью безопасным, но стандартизирует базовый уровень защиты от распространённых ошибок.
Усиление C++26 не делает C++ внезапно безопасным по памяти и не заменяет санитайзеры, статический анализ, хороший дизайн API или тщательную проверку данных.
- steveklabnik
Одна вещь, которая мне любопытна во всём этом: я думал, что всё это попало в C++26, но нам всё ещё подают статьи вроде https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p43...
> Черновик C++26 ещё не прошёл финальное голосование
Это написано в соавторстве с Бьярне, так что я уверен, что это не просто так, но, возможно, я просто упускаю какую-то деталь. Я знаю, что Бьярне грозился наложить вето на C++26 из-за этого, но я думал, что он этого не сделал?
Есть ли кто-нибудь, кто следит за процессом чуть лучше меня, чтобы дать какой-то контекст?
- Cieric
В конце есть намёк на это, но я очень надеюсь, что контракты, проверяемые на этапе компиляции, станут более распространёнными. Я знаю, что некоторые языки, такие как Spark, Dafny и некоторые другие, делают это и генерируют неявные контракты для таких вещей, как деление на ноль. Я экспериментировал со своим собственным языком, который делает такие вещи, и возвращаться к C++ каждый день на работе — это на самом деле небольшое разочарование из-за этого.
- pama
С опозданием на 30 лет, но я возьму. Контракты выглядят полезными и менее запутанными, чем исключения.