避免 libgmp 中的中止

2023-12-20

我有一些使用 libgmp 的代码。在某些时候,用户可能会请求一个非常大的数字的阶乘。不幸的是,这会导致 libgmp 发出中止信号。

例如下面的代码:

#include <cmath>
#include <gmp.h>
#include <iostream>

int main() {

    mpz_t result;
    mpz_init(result);

    mpz_fac_ui(result, 20922789888000);

    std::cout << mpz_get_si(result) << std::endl;
}

结果是:

$ ./test 
gmp: overflow in mpz type
Aborted

显然,生产的数量确实很大。无论如何,有没有比中止更优雅地处理错误的方法。这是一个基于 GUI 的应用程序,它的中止几乎是处理此类问题的最不理想的方式。


根据中的代码,您似乎不走运mpz/realloc.c http://gmplib.org:8000/gmp-4.3/file/2fab0bbcffb4/mpz/realloc.c and mpz/realloc2.c http://gmplib.org:8000/gmp-4.3/file/2fab0bbcffb4/mpz/realloc2.c。如果请求了太多内存,它只会执行以下操作:

if (UNLIKELY (new_alloc > INT_MAX))
  {
    fprintf (stderr, "gmp: overflow in mpz type\n");
    abort ();
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

避免 libgmp 中的中止 的相关文章

随机推荐