Windows 版本 MPIR 上的内存损坏错误

问题描述

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

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

使用此脚本从 github 结帐编译 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);

这是已知解决方案的问题吗?或者是否有一种已知的方法可以准确地追踪出了什么问题?

解决方法

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

我使用简单透明的构建过程将 MPIR 的发行版放在一起,并与此版本链接,问题不会发生。

https://github.com/russellw/mpir