最近要移植一个linux的程序到windows,其中字符编码各种坑先不去说,在linux运行得好好的Botan库在windows下死活不行,按说我们只用了这个库的一个小功能,移植应该不存在大问题,折腾了两天,才发现是编译的库不支持Debug造成的,改用Release问题马上就解决了。
程序用到了botan的 CryptoBox::decrypt 函数用来解密原先加密的字符串,linux下正常工作,在visual studio 2017里,一运行就抛异常,而且这个异常显得神秘而又诡异:
vector<T> too long
应该是在库内部运行之时出的错误,当时怀疑是不是字符编码的问题,因为这之前刚好改了好几个地方都是编码问题,难道这个错误也是因为字符字节数不一致导致长度计算问题?按这个方向越走越远,查了Botan库的源码,不得要领。
后来又想到是不是因为平台不同,原先linux下加密的密文和windows下不一致导致了解密过程的错误。于是,干脆做一个windows下的加密工具,本来这个加密是可以在linux下做的没有计划要移植。
这一做,发现加密的过程也出现了神秘的异常,调用 CryptoBox::encrypt 函数的异常:
PBKDF2 cannot accept passphrase of the given size
什么?因为给定的长度不接受密码短语,难道还是编码问题? 结果刚刚回头的人又被导向编码问题的方向……
后来差点要相信玄学去了的时候,想到botan-test.exe能够正常运行,说明botan是能够支持编码的,而且tests的源码也并没有什么特殊之处,按理直接移植过来就OK了的。就干脆把tests项目导入到vs2017,结果让人捉摸不透的异常依旧存在。
后来实在是不愿意相信玄学,就到处看看其它和Botan相关的问题,看看别人都踩过什么坑,无意中看到这篇文章,我引用一下:
Botan在visual studio 2010下无法正常运行 [问题点数:40分]
第一次发帖向各位有心人进行求助。因为项目需要对一些数据进行加密解密所以就选择了Botan这个包含加解密算法库。去官方网站下载Botan源码,对其进行编译生成 头文件,botan.lib,botan.dll文件,将其进行导入测试,问题随之出现
测试代码只有以下一句话
Botan::LibraryInitializer init;//库的初始化操作,库中的操作依赖该对象的生命周期
当程序执行到此处的时候,会发生中断
提示信息
“botan32.exe 中的 0x770115ee 处有未经处理的异常: 0xC0000005: 读取位置 0x001e0000 时发生访问冲突”
跟踪进去进入函数
void * __cdecl _malloc_base (size_t size)
{
void *res = NULL;
// validate size
if (size <= _HEAP_MAXREQ) {
for (;;) {
// allocate memory block
res = _heap_alloc(size); //此处发生中断
// if successful allocation, return pointer to memory
// if new handling turned off altogether, return NULL
if (res != NULL)
{
break;
}
if (_newmode == 0)
{
errno = ENOMEM;
break;
}
// call installed new handler
if (!_callnewh(size))
break;
// new handler was successful -- try to allocate again
}
} else {
_callnewh(size);
errno = ENOMEM;
return NULL;
}
RTCCALLBACK(_RTC_Allocate_hook, (res, size, 0));
if (res == NULL)
{
errno = ENOMEM;
}
return res;
}
或者
void __cdecl _free_base (void * pBlock)
{
int retval = 0;
if (pBlock == NULL)
return;
RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));
retval = HeapFree(_crtheap, 0, pBlock); //此处发生中断
if (retval == 0)
{
errno = _get_errno_from_oserr(GetLastError());
}
}
运行环境是WIN 7 64位,visual studio 2010,本人换过好几个botan的版本包括32位,64位的都出现类似的问题,望有心人能够帮助我进行问题的解决,或者是提供一套能够运行Boton的环境,不胜感激!
虽然问题看来不是很相关,因为前面折腾时也时常遇到访问冲突,调试过程发现是读取越界,所以就继续往下看:
该问题导致的原因已经找到,跟踪进入botan 编译配置脚本发现有
build_group.add_option('--enable-debug', dest='debug_build',
action='store_true', default=False,
help='enable debug build')
而问题导致的原因就是我在进行编译配置的时候没有指定--enable-debug,而默认的配置是--disable-debug,编译出来的库是release版本,而我进行测试的时候工程一直是debug版本导致出现了问题,希望能给遇到同样问题的同学提供一点帮助。
楼主 pullus_1st 的一番话立即引起了注意。原来如此!
马上把移植的项目切换到Release编译,OK!
参考 https://blog.csdn.net/found/article/details/88988593 《在windows下编译Botan》
把2. 安装python,如果没有的话,然后运行configure.py中的命令加上 --debug-mode 选项就好了:
python configure.py --cc=msvc --os=windows --cpu=x86_32 --debug-mode
https://github.com/randombit/botan/issues/136从这里看起来连owner都不太清楚这个选项有什么用了