Double-Free 运动没有达到预期效果
Double-Free exercise doesn't act as expected
我正在阅读 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
函数传递给它,然后紧接着在 main
中。
为什么 运行 没有参数时这不会失败?我正在使用 linux (POP!_OS 20.04) 和 GCC 9.3.0。
编辑:对于更多上下文,这本书建议我应该看到这样的输出:
% ./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)
增加免费电话也没有任何作用。
我得到了使用部分,但没有核心转储。
很抱歉占用大家的时间。我想到了。
该崩溃行为应该由 dmalloc 提供,但是自从我正在阅读的本书的写作以来,它的用法发生了一些变化。
我需要将 -DDMALLOC_FUNC_CHECK
添加到编译器选项以使其产生预期的结果。
我学会了它的 dmalloc,而不是 OS 当你双重释放指针时导致程序崩溃的
我正在阅读 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
函数传递给它,然后紧接着在 main
中。
为什么 运行 没有参数时这不会失败?我正在使用 linux (POP!_OS 20.04) 和 GCC 9.3.0。
编辑:对于更多上下文,这本书建议我应该看到这样的输出:
% ./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)
增加免费电话也没有任何作用。 我得到了使用部分,但没有核心转储。
很抱歉占用大家的时间。我想到了。
该崩溃行为应该由 dmalloc 提供,但是自从我正在阅读的本书的写作以来,它的用法发生了一些变化。
我需要将 -DDMALLOC_FUNC_CHECK
添加到编译器选项以使其产生预期的结果。
我学会了它的 dmalloc,而不是 OS 当你双重释放指针时导致程序崩溃的