Указание обработчика нарушений для контрактов - PullRequest
0 голосов
/ 03 июля 2018

Поддержка контрактного программирования в C ++ был принят на рабочий проект C ++ 20 в Рапперсвиле. Одна часть этой языковой функции - это понятие обработчик нарушений , который будет вызываться при нарушении договора.

Отчет о поездке Херба Саттера гласит:

Вы можете установить собственный обработчик нарушений и отправить сборку релиза с возможностью включения принудительного исполнения во время выполнения.

Но формулировка в [dcl.attr.contract] , добавленная в этом документе, гласит:

Обработчик нарушения программы является функцией типа «noexcept opt функция (lvalue ссылка на const std​::​contract_­violation), возвращающая void ”, и определяется способом, определяемым реализацией. [...] Не должно быть никакого программного способа установки или изменения обработчика нарушения. Это определяется реализацией, как устанавливается обработчик нарушения для программы и как устанавливается значение аргумента std​::​contract_­violation ([support.contract.cviol]), за исключением случаев, указанных ниже.

Это очень неясно для меня. Как реализация может позволить мне установить свой собственный обработчик нарушений непрограммным способом? Что мне придется делать на gcc, clang и msvc?

1 Ответ

0 голосов
/ 03 июля 2018

Как реализация может позволить мне установить собственный обработчик нарушений непрограммным способом?

Это для реализации, чтобы определить, но я скорее подозреваю, что это будет какой-то параметр командной строки. Вы бы назвали функцию, и компилятор / компоновщик сделал бы это обработчиком нарушения. А если нет, то они, вероятно, выберут какое-то конкретное имя функции, которое вы реализуете.

Дело в том, что используемая функция является статической с точки зрения абстрактной модели C ++. Когда запускается компилятор, он точно знает, какая функция будет вызвана, так же как и вызов системой main, а также часть программы, которая обрабатывает возвращаемые значения main.

...