0

我陷入了一个奇怪的问题。我有一个使用 gyp 项目创建的 exe,并且支持 common.gypi 为 32 位和 64 位 linux 构建 exe。但是,当我为 64 位 linux 构建并在代码中的某个位置调用 memcpy 时,内容会被清零。使用 -m32 标志为 32 位平台构建不会导致此问题。我怀疑头文件可能存在问题,因为项目的头文件对于 32 位和 64 位平台都是通用的。有人可以提供一些指示如何解决这个问题吗?二进制文件是动态链接的,并使用 GLIBC lgcc、lc 和 lm。非常感谢该领域的任何指针。我很乐意提供所需的任何其他信息。谢谢。

更新:一点点代码片段:这是代码的基本片段:

dst->flags           = src->flags;
src->b = dst->b;
and few more assignments
memcpy(dst, src, size here is 152);
size of dst is 224 and size of src is 496. 

问题是最初复制到 dst 的标志值在调用 memcpy 后变为零。为 32 位构建时的相同逻辑可以正常工作。

4

1 回答 1

2

仔细阅读memcpy(3)的文档。源区域和目标区域不允许重叠(否则为未定义行为)。编译时不要忘记启用所有警告和调试信息 ( gcc -Wall -Wextra -g)

您可能想改用memmove(3)

watch要调试此类问题,您可以在调试器中使用命令设置观察点,并且可以使用gdb最新的GCC-fsanitize=address作为编译标志。或valgrind等...

于 2014-10-29T09:40:00.770 回答