memcpy 混淆溢出/用 gcc 覆盖?
memcpy confusion overflow / overwriting with gcc?
不确定我在这里做错了什么。我猜测它的内存对齐问题,但对于为什么会发生这种情况感到困惑。使用 gcc 7.4.0 和 onlinegdb.com 在本地进行测试。 (可以在这里复制代码并粘贴/编译确认)
适用于将数据类型转换为 char/uint8_t 但 int 或 short/uint16_t 无效(data2 结构成员被修改)。
#include <stdio.h>
struct test {
int *data;
int *data2;
};
struct test *Test=NULL;
int buffer[] = {1,2,3,4,5};
int main()
{
Test = malloc(sizeof(struct test));
memset(Test, 0, sizeof(struct test));
printf("Before memcpy %d\r\n", Test->data2);
Test->data = malloc(sizeof(buffer));
memcpy(&Test->data, buffer, sizeof(buffer));
printf("After memcpy %d\r\n", Test->data2);
return 0;
}
data2 struct member is expected to be 0, however the value has changed after the memcpy for struct member data is executed.
Output:
Before memcpy 0
After memcpy 3
memcpy(&Test->data, buffer, sizeof(buffer));
您正在传递变量 data
的地址,它是一个指针,并向其复制比其边界更多的字节,这就是修改变量 data2
的原因(作为指针,Test->data
有 4 或 8 个字节,具体取决于您使用的架构 运行 代码)。
您可能希望将 Test->data
传递给 memcpy
作为其 dst
参数,而不是 &Test->data
。
不确定我在这里做错了什么。我猜测它的内存对齐问题,但对于为什么会发生这种情况感到困惑。使用 gcc 7.4.0 和 onlinegdb.com 在本地进行测试。 (可以在这里复制代码并粘贴/编译确认)
适用于将数据类型转换为 char/uint8_t 但 int 或 short/uint16_t 无效(data2 结构成员被修改)。
#include <stdio.h>
struct test {
int *data;
int *data2;
};
struct test *Test=NULL;
int buffer[] = {1,2,3,4,5};
int main()
{
Test = malloc(sizeof(struct test));
memset(Test, 0, sizeof(struct test));
printf("Before memcpy %d\r\n", Test->data2);
Test->data = malloc(sizeof(buffer));
memcpy(&Test->data, buffer, sizeof(buffer));
printf("After memcpy %d\r\n", Test->data2);
return 0;
}
data2 struct member is expected to be 0, however the value has changed after the memcpy for struct member data is executed.
Output:
Before memcpy 0
After memcpy 3
memcpy(&Test->data, buffer, sizeof(buffer));
您正在传递变量 data
的地址,它是一个指针,并向其复制比其边界更多的字节,这就是修改变量 data2
的原因(作为指针,Test->data
有 4 或 8 个字节,具体取决于您使用的架构 运行 代码)。
您可能希望将 Test->data
传递给 memcpy
作为其 dst
参数,而不是 &Test->data
。