MinGW GCC编译下fwrite写入超4GB大缓冲区失败问题
MinGW x86_64-w64-mingw32-gcc编译下fwrite写入大数组异常卡住问题
尝试将8GB的uint64_t数组写入文件时,遇到以下异常:
- 使用MinGW的
x86_64-w64-mingw32-gcc编译程序后,fwrite仅写入约290MB(305,131,520字节)就卡住,此时CPU满负载但磁盘无读写活动,只能手动终止程序。 - 改用Visual Studio编译相同代码,可正常写入完整数组。
测试验证:
- 当数组元素数超过536,870,912(对应4GB数据量)时,问题必现。
- 升级GCC至13.2.0版本后,问题仍未解决。
不同元素数的测试结果如下:
| numItems | bytes written | bytes expected | distance to uint32.MAX + 1 | gets stuck? |
|---|---|---|---|---|
| 200000000 | 1600000000 | 1600000000 | 2694967296 | NO |
| 400000000 | 3200000000 | 3200000000 | 1094967296 | NO |
| 536870911 | 4294967288 | 4294967288 | 8 | NO |
| 536870912 | 0 | 4294967296 | 0 | YES |
| 536870913 | 0 | 4294967304 | -8 | YES |
| 536871424 | 4096 | 4294971392 | -4096 | YES |
| 600000000 | 505032704 | 4800000000 | -505032704 | YES |
| 1000000000 | 3705032704 | 8000000000 | -3705032704 | YES |
| 1073741822 | 4294963200 | 8589934576 | -4294967280 | YES |
| 1073741823 | 4294963200 | 8589934584 | -4294967288 | YES |
| 1073741824 | 0 | 8589934592 | -4294967296 | YES |
| 1073742336 | 4096 | 8589938688 | 4294971392 | YES |
| 1111883624 | 305131520 | 8895068992 | -4600101696 | YES |
推测:fwrite内部可能使用了32位变量,导致处理超过4GB的数据时出现溢出或死循环。请问是否有人能复现该问题?
内容的提问来源于stack exchange,提问作者MrPuzzler
相关产品推荐
相关产品推荐

