c - 无法解决客户端-服务器程序上大小为 1 的无效读取
c - can't solve Invalid read of size 1 on a client-server program
客户端和服务器通过发送这种类型的结构来交换消息:
typedef struct {
op_t op;
char sender[MAX_NAME_LENGTH+1];
} message_hdr_t;
typedef struct {
char receiver[MAX_NAME_LENGTH+1];
unsigned int len;
} message_data_hdr_t;
typedef struct {
message_data_hdr_t hdr;
char *buf;
} message_data_t;
typedef struct {
message_hdr_t hdr;
message_data_t data;
} message_t;
客户端和服务器之间交换的消息正确到达并继续执行,但 valgrind returns 错误:
==4179== Invalid read of size 1
==4179== at 0x4C32D04: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4179== by 0x50B84D2: vfprintf (vfprintf.c:1643)
==4179== by 0x50BFF25: printf (printf.c:33)
==4179== by 0x10A122: threadF (main.c:151)
==4179== by 0x4E436DA: start_thread (pthread_create.c:463)
==4179== by 0x517C88E: clone (clone.S:95)
==4179== Address 0x5452134 is 0 bytes after a block of size 4 alloc'd
==4179== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4179== by 0x109B2B: readData (connections.h:103)
==4179== by 0x109C17: readMsg (connections.h:134)
==4179== by 0x10A0B0: threadF (main.c:146)
==4179== by 0x4E436DA: start_thread (pthread_create.c:463)
==4179== by 0x517C88E: clone (clone.S:95)
这就是我在 readData() 中填充服务器结构的方式;
你可以把readn当作已读。
#define SYSCALL(r,c,msg) \
if((r=c)==-1) {perror(msg);
//other reads and writes
msg->data.buf=malloc(msg->data.hdr.len*sizeof(char));
SYSCALL(notused,readn(fd,msg->data.buf,msg->data.hdr.len*sizeof(char)),"read_data_buf");
if(notused==0){
return -1;
}
当我在 main.c:151
上执行 printf 时出现错误
printf("BODY: %s\n",msg->data.buf);
可能
msg->data.buf=malloc(msg->data.hdr.len*sizeof(char));
SYSCALL(notused,readn(fd,msg->data.buf,msg->data.hdr.len*sizeof(char)),"read_data_buf");
必须
msg->data.buf=malloc(msg->data.hdr.len + 1);
SYSCALL(notused,readn(fd,msg->data.buf,msg->data.hdr.len),"read_data_buf");
msg->data.buf[msg->data.hdr.len] = 0;
为结束空字符添加位置并设置它
但是你确定msg->data.buf
是一个可打印的字符串吗?您如何在交换期间对您的结构进行编码?
同样sizeof(char)
根据定义是1,乘以它是没有用的
根据这条消息
==4179== Address 0x5452134 is 0 bytes after a block of size 4 alloc'd
你已经分配了 4 个字节。
您的 printf
电话
printf("BODY: %s\n",msg->data.buf);
期望找到以 [=13=]
结尾的字符串
可能你用SYSCALL(notused,readn(...
读取的字节在这4个字节中不包含'[=15=]'
,所以strlen
读取分配内存结束后的下一个字节。
解决此问题的一个选择是再分配一个字节并将 '[=15=]'
附加到接收到的数据。
客户端和服务器通过发送这种类型的结构来交换消息:
typedef struct {
op_t op;
char sender[MAX_NAME_LENGTH+1];
} message_hdr_t;
typedef struct {
char receiver[MAX_NAME_LENGTH+1];
unsigned int len;
} message_data_hdr_t;
typedef struct {
message_data_hdr_t hdr;
char *buf;
} message_data_t;
typedef struct {
message_hdr_t hdr;
message_data_t data;
} message_t;
客户端和服务器之间交换的消息正确到达并继续执行,但 valgrind returns 错误:
==4179== Invalid read of size 1
==4179== at 0x4C32D04: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4179== by 0x50B84D2: vfprintf (vfprintf.c:1643)
==4179== by 0x50BFF25: printf (printf.c:33)
==4179== by 0x10A122: threadF (main.c:151)
==4179== by 0x4E436DA: start_thread (pthread_create.c:463)
==4179== by 0x517C88E: clone (clone.S:95)
==4179== Address 0x5452134 is 0 bytes after a block of size 4 alloc'd
==4179== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4179== by 0x109B2B: readData (connections.h:103)
==4179== by 0x109C17: readMsg (connections.h:134)
==4179== by 0x10A0B0: threadF (main.c:146)
==4179== by 0x4E436DA: start_thread (pthread_create.c:463)
==4179== by 0x517C88E: clone (clone.S:95)
这就是我在 readData() 中填充服务器结构的方式; 你可以把readn当作已读。
#define SYSCALL(r,c,msg) \
if((r=c)==-1) {perror(msg);
//other reads and writes
msg->data.buf=malloc(msg->data.hdr.len*sizeof(char));
SYSCALL(notused,readn(fd,msg->data.buf,msg->data.hdr.len*sizeof(char)),"read_data_buf");
if(notused==0){
return -1;
}
当我在 main.c:151
上执行 printf 时出现错误printf("BODY: %s\n",msg->data.buf);
可能
msg->data.buf=malloc(msg->data.hdr.len*sizeof(char));
SYSCALL(notused,readn(fd,msg->data.buf,msg->data.hdr.len*sizeof(char)),"read_data_buf");
必须
msg->data.buf=malloc(msg->data.hdr.len + 1);
SYSCALL(notused,readn(fd,msg->data.buf,msg->data.hdr.len),"read_data_buf");
msg->data.buf[msg->data.hdr.len] = 0;
为结束空字符添加位置并设置它
但是你确定msg->data.buf
是一个可打印的字符串吗?您如何在交换期间对您的结构进行编码?
同样sizeof(char)
根据定义是1,乘以它是没有用的
根据这条消息
==4179== Address 0x5452134 is 0 bytes after a block of size 4 alloc'd
你已经分配了 4 个字节。
您的 printf
电话
printf("BODY: %s\n",msg->data.buf);
期望找到以 [=13=]
可能你用SYSCALL(notused,readn(...
读取的字节在这4个字节中不包含'[=15=]'
,所以strlen
读取分配内存结束后的下一个字节。
解决此问题的一个选择是再分配一个字节并将 '[=15=]'
附加到接收到的数据。