Magick++7引发C++程序非确定性行为,是否为库的问题?
问题分析与解决:A*路径规划程序结合Magick++ 7后的随机网格错误
问题现象
- 基于A*搜索算法开发的C++程序,支持将字符串解析为占用网格,并计算、打印起点到终点的最短路径,单独运行时功能正常
- 若将Magick++ 7库的初始化及图片操作代码放在路径规划逻辑之前,网格最后一行会随机出现被错误标记为占用的非确定性行为
- 把库代码移至路径规划逻辑之后,该异常完全消失
排查过程与根因定位
通过-fsanitize=address地址 sanitizer工具编译检测,定位到问题根源是内存分配的off-by-1错误:
原代码中计算网格内存占用的逻辑为:
size_t grid_size = (grid->cols * grid->rows * sizeof(unsigned char)) / 8;
当网格的总比特数无法被8整除时,该计算会少分配1个字节,导致程序后续访问超出分配范围的未初始化内存。而Magick++库的初始化操作会改变进程的内存布局,使得越界访问的内存区域恰好被标记为占用状态,从而触发随机的错误表现;若库代码放在路径规划之后,越界访问的内存尚未被修改,因此问题不会显现。
修复方案
修正内存分配的计算逻辑,增加1个字节的冗余以覆盖无法整除的情况:
size_t grid_size = (grid->cols * grid->rows * sizeof(unsigned char)) / 8 + 1;
修正后,程序无论Magick++代码的执行顺序如何,均能正常运行,异常问题完全解决。
内容的提问来源于stack exchange,提问作者Duncan Britt
相关产品推荐
相关产品推荐

