2

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()の後の最初の行は、それが問題になるのを防ぐだろうと思いました。何かを見落としていると思います。助けていただければ幸いです。

編集:プログラムはセグメンテーション違反でクラッシュを終了します。

4

2 に答える 2

2

(Valgrind の報告によると) あたかも のように聞こえmethodますNULL。デバッガーを使用してこのコードをステップ実行し、トークン化が意図したとおりに機能することを確認する必要があります。

また、これらのポインターはすべて、書き込みをconst char *意図していないため、 として宣言する必要があります。これはもちろん些細な点ですが、const可能な限り の使用を奨励するようにしています。:)

于 2012-11-28T09:17:49.617 に答える
1
Address 0x0 is not stack'd, malloc'd or (recently) free'd

ここで何かが間違っています: プログラムが NULL を逆参照しているようです。最後に segfault を実行するかどうか疑問に思っていstrtok()ます。トークンが見つからない場合は NULL を返すため、 の戻り値を確認する必要があります。

于 2012-11-28T09:27:48.717 に答える