0

我在使用 Windows 版本的 MPIR 时遇到内存损坏错误,该错误显示在以下最小测试用例中。

Microsoft (R) C/C++ 优化编译器版本 19.25.28610.4 for x64

使用此脚本从 github checkout 编译 MPIR(刚刚验证了问题仍然在最新版本中重现):

pushd \mpir\msvc\vs19
call msbuild.bat gc DLL x64 Debug
call msbuild.bat gc LIB x64 Release
popd
copy \mpir\dll\x64\Debug\mpir.dll

使用这个源文件作为测试用例:

#include <stdio.h>
#include <gmp.h>

int main(int argc, const char **argv) {
  mpz_t x;
  mpz_init_set_str(x,"123",10);
  mpz_out_str(stdout,10,x);
  putchar('\n');
  return 0;
}

像这样编译:

cl /I\mpir /MTd a.cc \mpir\dll\x64\Debug\mpir.lib

并运行生成的程序,产生正确的输出,但在退出时显示堆损坏,在弹出窗口中显示错误消息,不幸的是不允许复制粘贴,但它在

C:\Program Files (x86)\Windows Kits\10\Source\10.0.18362.0\ucrt\heap\debug_heap.cpp

第 996 行,即

        _ASSERTE(__acrt_first_block == header);

这是已知解决方案的问题吗?或者是否有一种已知的方法可以准确地找出问题所在?

4

1 回答 1

0

我从来没有追查过问题的确切原因,但我认为它与构建过程有关,它通过许多抽象层使用 MSBuild,几乎不可能确定到底发生了什么。

我已经使用简单的透明构建过程组合了 MPIR 的分发,并与此版本链接,问题不会发生。

https://github.com/russellw/mpir

于 2021-03-19T17:53:47.480 回答