1

Robert C. Seacord の「Effective C」という本を読んでいます。この本では、dmalloc を使用してテストして原因をデバッグできるように、ポインターを意図的に二重に解放する演習があります。ただし、期待どおりに失敗することはありません。

#include <string.h>
#include <stdlib.h>

#ifdef DMALLOC
#include "dmalloc.h"
#endif

void usage(char *msg) {
    fprintf(stderr, "%s", msg);
    free(msg);
    return;
}

int main(int argc, char *argv[]) {
    if (argc != 3 && argc !=4) {
        /* The error message won't be more than 80 chars */
        char *errmsg = (char *)malloc(80);
        sprintf(
            errmsg,
            "Sorry %s,\nUsage: caesar secret_file keys_file [output_file]\n",
            getenv("USER")
        );
        usage(errmsg);
        free(errmsg);
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}

*errmsgここでは、2 回解放する必要があることは明らかです。最初にusage関数が渡されたときに関数によって解放され、次に in の直後に解放されmainます。引数なしで実行したときにこれが失敗しないのはなぜですか? GCC 9.3.0 で Linux (POP!_OS 20.04) を使用しています。

編集:より多くのコンテキストについては、本は次のような出力が表示されることを示唆しています:

% ./caesar
Sorry student,
Usage: caesar secret_file keys_file [output_file]
debug-malloc library: dumping program, fatal error
  Error: tried to free previously freed pointer (err 61)
Aborted (core dumped)

free にさらに通話を追加しても、何も起こりません。使用部分は取得できますが、コア ダンプは取得できません。

4

1 に答える 1