| #include <exception> |
| #include <contract> |
| #include <dlfcn.h> |
| |
| using handler = void (*)(const std::contract_violation &); |
| constexpr const char *mangledHandlerName = "_Z25handle_contract_violationRKSt18contract_violation"; |
| void handle_contract_violation(const std::contract_violation &violation) { |
| try { |
| handler original_handle_contract_violation; |
| original_handle_contract_violation = |
| (handler)dlsym(RTLD_NEXT, mangledHandlerName); |
| (*original_handle_contract_violation)(violation); |
| } |
| catch(...) { |
| ; // squash |
| } |
| std::terminate(); |
| } |
| |