在C中使用strdup的奇数错误

时间:2012-10-24 05:27:03

标签: c malloc strdup

我正在尝试在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“)”,我也会遇到同样的问题。

3 个答案:

答案 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

你将有缓冲区溢出的行。

这么简单!