c++ - BN_CTX_free() vs BN_CTX_end() EXC_BAD_ACCESS 异常
问题描述
从OpenSSL 文档中,BN_CTX_end()
必须在之前调用BN_CTX_free()
,但是在下面的示例中,当我按照文档指定的顺序运行程序时出现错误的访问异常(请注意文档在大多数情况下说,但我不确定如何检查我是否应该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();
不调用上下文,则不会正确释放上下文。
解决方案
我不是 OpenSSL 的专家,但文档说
函数必须首先调用 BN_CTX_start()。然后,可以重复调用 BN_CTX_get() 以获得临时 BIGNUM。在调用使用 ctx 作为参数的任何其他函数之前,必须进行所有 BN_CTX_get() 调用。
最后,必须调用 BN_CTX_end()
因此,请尝试BN_CTX_start
在开头添加 a BN_CTX_new
(请参阅https://www.openssl.org/docs/man1.0.2/man3/BN_CTX_start.html)
其次,来自文档:
当调用 BN_CTX_end() 时,从 BN_CTX_get() 获得的 BIGNUM 指针变为无效。
所以你可能想尽量避免释放 sum 因为一旦你调用它就会被释放(至少据我所知)BN_CTX_end()
最后(小问题):
BIGNUM *sum = BN_new();
....
sum = BN_CTX_get(ctx);
首先分配 a BIGNUM
,然后用另一个指向另一个内存位置的指针覆盖指针。因此,您会丢失指针,造成内存泄漏,请考虑使用BN_new()
(在这种情况下您必须释放)或BN_CTX_get
我尝试使用 MSVC 2019 进行编译并调用BN_CTX_start()
已经为我解决了这个问题。
推荐阅读
- regex - Google 数据洞察计算字段/正则表达式协助请求
- c - 如何使用文件描述符使用 posix 库将二进制数据写入和读取 C 中的文件?
- javascript - 正则表达式以不同方式匹配第一个单词
- php - json和php中的这段代码有什么问题... consol错误?
- angular - 为什么我的 Angular 应用程序中出现此错误?
- c++ - C++ 中的模板参数类型分配器
- html - HTML 和 CSS 表格在 Android Firefox 中显示完美,但在 Android Chrome 中不完美
- c# - 如何在给定区域随机生成对象?
- python - 将 microbit 连接到 microbit python 编辑器的问题
- r - R:从 for 循环中保存模型输出 - 列表为空白