Valgrind错误:“;大小为1的读取无效;由于带有C的strstr()

Valgrind错误:“;大小为1的读取无效;由于带有C的strstr(),c,valgrind,strstr,null-terminated,C,Valgrind,Strstr,Null Terminated,Valgrind输出: 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 (h

Valgrind输出:

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()之后的第一行可以防止这成为一个问题。我猜我忽略了什么。谢谢你的帮助

编辑:程序以分段错误结束崩溃

听起来(来自Valgrind的报告),好像
方法
NULL
。您应该使用调试器逐步完成此代码,以验证标记化是否按预期工作

此外,您应该将所有这些指针声明为
constchar*
,因为它们不是要写入的。这当然是一个次要问题,但我尽量鼓励尽可能使用
const
。)


这里有点不对劲:程序似乎取消了对NULL的引用。我想知道它最终是否会出错-您应该检查
strtok()
的返回值,因为如果找不到更多令牌,它将返回NULL。

在strstr()调用之前添加if(method!=NULL&&requestURI!=NULL&&httpVersion!=NULL)后,我能够避免错误。谢谢情况就是这样。我在strstr()调用之前添加了if(method!=NULL&&requestURI!=NULL&&httpVersion!=NULL),并且能够避免错误。谢谢@Twigger好的,很好。老实说,我认为这是你应该接受的答案,因为我在彼得之前(正确地)回答了。)公平地说,从我的角度来看,我正在学校的服务器上工作,没有一种方法可以在没有巨大不便的情况下使用调试器逐步完成代码。皮特的答案更容易应用,帮助我首先建立联系。
Address 0x0 is not stack'd, malloc'd or (recently) free'd