Valgrind的输出 “尺寸1的无效读”:Valgrind的错误:由于的strstr()以C
GET /cs3157/tng/index.html
==760== Invalid read of size 1
==760== at 0x4C2E7D4: strstr (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==760== by 0x400E67: HandleTCPClient (http-server.c:101)
==760== by 0x400D42: main (http-server.c:75)
==760== Address 0x0 is not stack'd, malloc'd or (recently) free'd
相关的代码:
FILE *input = fdopen(clntSocket, "r"); //socket wrapped with FILE *
if (input == NULL)
{
perror("fdopen failed");
fclose(input);
return;
}
char request_buffer[100];
char out_buf[BUF_SIZE];
int len, res;
while(fgets(request_buffer, sizeof(request_buffer),input) != NULL)
{
request_buffer[sizeof(request_buffer)-1] = '\0'; //null terminates buffer
char *request = request_buffer;
char *token_separators = "\t \r\n"; // tab, space, new line
char *method = strtok(request, token_separators);
char *requestURI = strtok(NULL, token_separators);
char *httpVersion = strtok(NULL, token_separators);
if(strstr(method,"GET") != NULL)
{
if(requestURI[strlen(requestURI)] == '/')
requestURI = strcat(requestURI,"index.html");
printf("%s %s\n", method, requestURI);
}
memset(request_buffer,'\0',sizeof(request_buffer));
}
fclose(input); //close the socket by closing the FILE * wrapper
我读到此错误通常是由故障引起的以null终止字符串。我认为在fgets()之后的第一行会阻止它成为问题。我在猜测我忽略了一些东西。我感谢任何帮助。
编辑:程序结束与分段故障崩溃。
情况就是这样。我在strstr()调用之前添加了if(method!= NULL && requestURI!= NULL && httpVersion!= NULL)并且能够避免该错误。谢谢! –
@Twigger好的,很好。我真的认为这是你应该接受的答案,然后,因为我在peterph之前回答(正确)。 :) – unwind
从我的角度来看,我正在学校的服务器上工作,并且没有办法通过调试程序来执行代码,而没有很大的不便。 Peterph的答案更容易应用,并帮助我首先进行连接。 –