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应该被释放两次:首先是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)

添加更多免费电话也无济于事。我得到了使用部分,但没有得到核心转储。

4

1 回答 1

0

我很抱歉占用了人们的时间。我想到了。这种崩溃行为应该是由 dmalloc 提供的,但是自从我正在阅读这本书之后,它的用法发生了一些变化。我需要添加-DDMALLOC_FUNC_CHECK到编译器选项中才能产生预期的结果。

我了解了它的 dmalloc,而不是在您双重释放指针时导致程序崩溃的操作系统。

于 2021-02-10T12:33:55.323 回答