Лучший способ корректно обработать эти ошибки в вашем приложении - это, вероятно, отключить вспомогательный процесс для выполнения вычислений GMP.Если вспомогательный процесс убит SIGABRT
, ваш родительский процесс может обнаружить это и сообщить об ошибке пользователю.
(Ниже приведен мой оригинальный ответ, который имеет «неопределенные результаты»"в соответствии с документацией GMP - здесь она оставлена для полноты).
Вы можете обнаружить ошибку, если установите обработчик сигнала для SIGABRT
, который использует longjmp()
:
jmp_buf abort_jb;
void abort_handler(int x)
{
longjmp(abort_jb, 1);
}
int dofac(unsigned long n)
{
signal(SIGABRT, abort_handler);
if (setjmp(abort_jb))
goto error;
mpz_t result;
mpz_init(result);
mpz_fac_ui(result, 20922789888000);
std::cout << mpz_get_si(result) << std::endl;
signal(SIGABRT, SIG_DFL);
return 0;
error:
signal(SIGABRT, SIG_DFL);
std::cerr << "Caught SIGABRT from GMP.\n";
return 1;
}