2

valgrind を使用してコードの一部を調べていると、次のエラーが発生します。

==7001== Invalid read of size 1
==7001==    at 0x402E21B: strstr (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==7001==    by 0x8049742: replace_in_file (functions.c:191)
==7001==    by 0x8049C55: parse_dir (functions.c:295)
==7001==    by 0x8049059: main (main.c:214)
==7001==  Address 0x42018c3 is 0 bytes after a block of size 3 alloc'd
==7001==    at 0x402B018: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==7001==    by 0x80496EC: replace_in_file (functions.c:183)
==7001==    by 0x8049C55: parse_dir (functions.c:295)
==7001==    by 0x8049059: main (main.c:214)

コード スニペットは次のようになります。

long int replace_in_file(char **sets, FILE *file, char *path, const char *mode){
    long int n = 0, size = 0, len, remaining_len;

    char *buffer,
         *found,
         *before,
         *after;

    size = file_size(file);
    if(-1 != size){

        buffer = malloc(size * sizeof(char));

        rewind(file);
        fread(buffer, 1, size, file);

        int i=0;
        do{
            do{
                found = strstr(buffer, sets[i]); // LINE 191
                if(NULL != found && '\0' != sets[i][0]){

//rest of code...

すべてが期待どおりに機能し、デバッガーではすべての変数が正常に見えるため、なぜそのエラーが発生するのかわかりません。

何が問題なのですか、どうすれば修正できますか?

4

3 に答える 3

5

fread()読み取るデータをヌル終了しませstrstr()が、ヌル終了文字列を期待します。size+1 バイトを割り当て、安全のために明示的に nul ターミネータを追加する必要があります。

于 2012-05-03T16:48:08.857 に答える
4

あなたbufferはヌル終了していません。通常、および同様の機能で動作することを確認するためbzero()に、 の直前に置くことができます。fread()strstr()

于 2012-05-03T16:52:49.893 に答える
2

私のマンページで読んだことから、 -C89に従って結果を終了しfread()ませんNULL-そして私のシステムでもそうしません-あなたがそれを終了しない限りstrstr()、単に最後まで読みますbuffer

buffer = malloc((size + 1) * sizeof(char));
memset(buffer, '\0', size + 1);

(これには、fread がファイル全体の読み取りに失敗した場合に終了するという利点もあります)

補足: 呼び出しで既に を使用sizeof(char)しているため、一貫性を保つために をmalloc()置き換えることも検討してください。1fread()

于 2012-05-03T17:02:42.513 に答える