BN_CTX_free()与BN_CTX_end()EXC_BAD_ACCESS异常

时间:2019-06-14 14:41:02

标签: c++ pointers openssl allocation

必须从OpenSSL docsBN_CTX_end()之前调用BN_CTX_free(),但是在下面的示例中,当我按docs指定的顺序运行程序时,我得到了一个错误的访问异常(请注意,在大多数情况下,文档会说 ,但我不确定如何检查是否应该在BN_CTX_end()之前致电BN_CTX_free()

BIGNUM* util::math::find_seed_num(std::vector<int> lst, int lst_int, int index) {
    //python: reduce((lambda x, y: x * y), lst[0:index]) % lst_int

    BN_CTX* ctx;
    ctx = BN_CTX_new();

    cout << "\nsize of lst " << lst.size() << "\n";
    BIGNUM *sum = BN_new();
    BIGNUM *tmp = BN_new();

    sum = BN_CTX_get(ctx);
    BN_set_word(sum, lst[0]);

    cout << "\n index: " << index << "\n";

    for (int a = 1; a < index; a = a + 1) {
        BN_set_word(tmp, lst[a]);
        cout << "temp = " << BN_bn2dec(tmp) << "\n";
        BN_mul(sum, sum, tmp, ctx);
        cout << "sum = " << BN_bn2dec(sum) << "\n";
    }

    BIGNUM *result = BN_new();
    BIGNUM *modulo = BN_new();

    BN_set_word(modulo, lst_int);

    BN_nnmod(result, sum, modulo, ctx);

    cout << "\nsum: " << BN_bn2dec(result) << "\n";

    BN_free(sum);
    BN_free(result);
    BN_free(modulo);
    BN_free(tmp);
    BN_CTX_end(ctx); //Running this produces the exception
    BN_CTX_free(ctx); //Running this w/out the above line leads to no exception thrown

    return result;
}

我是C ++的新手,因此我担心的是,如果未调用BN_CTX_end();,则无法正确释放上下文。

1 个答案:

答案 0 :(得分:2)

我不是OpenSSL的专家,但是文档说

  

一个函数必须首先调用BN_CTX_start()。然后,可以重复调用BN_CTX_get()以获得临时BIGNUM。所有BN_CTX_get()调用必须在调用使用ctx作为参数的任何其他函数之前进行。

     

最后,必须调用BN_CTX_end()

因此,请尝试在BN_CTX_start之后的开头添加BN_CTX_new(请参见https://www.openssl.org/docs/man1.0.2/man3/BN_CTX_start.html

第二,来自文档:

  

调用BN_CTX_end()时,从BN_CTX_get()获得的BIGNUM指针变为无效。

因此,您可能要尝试避免释放总和,因为一旦致电BN_CTX_end()

,总和就会被释放(至少据我所知)

最近(次要问题):

BIGNUM *sum = BN_new();
....
sum = BN_CTX_get(ctx);

首先分配一个BIGNUM,然后用另一个指向另一个内存位置的指针覆盖该指针。因此,您丢失了指针,造成了内存泄漏,请考虑使用BN_new()(在这种情况下必须释放)或BN_CTX_get

我尝试使用MSVC 2019进行编译,并调用BN_CTX_start()已经为我解决了该问题。