我正在尝试在C中使用strdup()函数但是我遇到了涉及malloc的奇怪错误。我的精简代码是:
void loadEntity(FILE *inFP, entity_t *ent, char *token) {
char buffer[100] = "buffer";
if (strcmp(token, "name") == 0) {
if (fscanf(inFP, "%s", buffer) != 1) {
fprintf(stderr,"%s\n", "Error reading name.");
exit(1);
}
//For testing purposes
fprintf(stdout, "Buffer: %s", buffer);
ent -> name = strdup(buffer);
}
}
结果是:
hw6: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
缓冲区:plane1Aborted(核心转储)
在结果的最后,你可以看到我的fprintf语句(Buffer:plane1)的结果,它应该是应该的。我的输入文本的第一行是“name plane1”。所以基本上,它看到了令牌名称,接下来的单词,然后设置了ent - >这个名字。看似简单,但它不起作用。请注意,即使我删除if语句,它也会有相同的结果。另外,如果我只是将它“strdup(”String“)”,我也会遇到同样的问题。
答案 0 :(得分:3)
另外,如果我只是将它设为“strdup(”String“)”,我也会遇到同样的问题。
我认为内存在其他地方已损坏,你应该使用valgrind或其他东西来检测内存泄漏,并从那里开始。
答案 1 :(得分:1)
我怀疑这是因为缓冲区太小而fscanf破坏了内存。尝试使用%99s作为快速测试。
永远不要写这样的代码,它允许外部数据导致缓冲区溢出。如果你看到这样的代码,刻录它,用火烧它! ; - )
答案 2 :(得分:0)
使用电围栏检测缓冲区溢出:
apt-get install electric-fence
gcc -c -o prog.o prog.c -g
gcc -o prog prog.o -lefence -g
gdb ./prog
run
你将有缓冲区溢出的行。
这么简单!