修复一个产品bug, 最终定位是memcpy使用的问题. 下面的示例代码:
#define N 16 int main() { int arr[N], i; for (i = 0; i < N; i++) arr[i] = i; printf("before memcpy:\n"); prt(arr, N); memcpy(&arr[0], &arr[1], (N - 1) * sizeof(int)); arr[N - 1] = 0; printf("after memcpy:\n"); prt(arr, N); return 0; }
在 Win7 x64, 一台 linux x64, 一台 Solaris x86, aix? 上 输出都如下:
before memcpy: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, after memcpy: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0,
但在 目标机器: Fedora 23_10 x86, 结果如下:
原因就是 memcpy不能用于 dest/src 重叠的内存. 程序改为memmove后 输出正常.
总结:
memcpy的man里说的很清楚:
"The memory areas must not overlap. Use memmove(3) if the memory areas do overlap."
memcpy用于 重叠内存, 则为undefined behavior. 也许在 各种测试环境下都没看到问题, 但迟早是要还得.
时间: 2024-10-24 05:29:03