1

我正在尝试在 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 -> name 设置为此。看起来很简单,但它不起作用。请注意,即使我删除了 if 语句,它也有相同的结果。此外,如果我将其设为“strdup("String")”,我也会遇到同样的问题。

4

3 回答 3

3

此外,如果我将其设为“strdup("String")”,我也会遇到同样的问题。

我认为内存在其他地方已损坏,您应该使用 valgrind 或其他东西来检测内存泄漏,然后从那里开始。

于 2012-10-24T05:47:52.653 回答
1

我怀疑这是因为缓冲区太小并且 fscanf 损坏了内存。尝试 %99s 作为对此的快速测试。

永远不要写这样的代码,它允许外部数据导致缓冲区溢出。如果你看到这样的代码,烧掉它,用火烧掉它!;-)

于 2012-10-24T05:43:16.823 回答
0

使用电子围栏检测缓冲区溢出:

apt-get install electric-fence

gcc -c -o prog.o prog.c -g
gcc -o prog prog.o -lefence -g

gdb ./prog

run

你会有缓冲区溢出的行。

很简单 !

于 2014-06-18T08:32:09.767 回答