我正在尝试在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,"%sn", "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(core倾倒)
在结果的最后,您可以看到我的fprintf语句(buffer:plane1)的结果,这完全是应有的。我的输入文本的第一行是"名称plane1"。因此,基本上,它看到了令牌名称,获取下一个单词,然后将ENT ->">"设置为此。似乎很简单,但它不起作用。请注意,即使我删除了if语句,也有相同的结果。另外,如果我只是将其" strdup(" string")",我会遇到同样的问题。
另外,如果我只是将其" strdup(" string")",我会遇到同样的问题。
我认为内存在其他地方被损坏,您应该使用Valgrind或其他东西来检测内存泄漏,然后从那里走。
我怀疑这是因为缓冲区太小,fscanf损坏了内存。尝试%99作为快速测试。
,永远不要像这样编写代码,这允许外部数据引起缓冲区溢出。如果您看到这样的代码,请烧掉它,用火烧!; - )
使用电动围栏检测缓冲区溢出:
apt-get install electric-fence
gcc -c -o prog.o prog.c -g
gcc -o prog prog.o -lefence -g
gdb ./prog
run
,您将拥有缓冲区溢出的线。
如此简单!