закрыть дыру в механизме исключений

crusader
crusader

Детали тут. Соответствующее предложение см. P0770R0.

Идея состоит в том чтобы ввести новое (эфемеральное) исключение, готорое гарантировано бросается независимо от состояния кучи. В контексте C++ Itanium ABI (используемого CLang/GCC/etc) это значит что если __cxa_allocate_exception() вернет NULL, то (вместо вызова std::terminate()) он будет передан в функции которые раскручивают стек и будет третироваться как специальный объект.

Как вариант (и для упрощения кода) эфемеральным исключением может быть std::bad_alloc -- чтобы он ловился через catch(std::bad_alloc). Понадобится способ отличения эфемерального std::bad_alloc от обычного ("bool std::is_ephemeral(std::bad_alloc&)" ?).

В контексте программы это значит что (в случае Itanium ABI) при нехватке памяти "throw MyException()" вместо аварийного завершения бросит эфемеральный std::bad_alloc, который может быть обработан и т.п. К сожалению, это также означает, что "throw 42" может также бросить эфемеральное исключение  -- что может быть сюрпризом для пользователя (хотя это конечно лучше чем крэш или зависание, которое может случиться сейчас).

Я осознал, что у меня нет желания бороться с бюрократией комитета чтобы протолкнуть эту идею и закрыть эту дыру. Может у вас оно есть :-)

0
рейтинг
Нет комментариев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения