总线错误。无法访问内存

时间:2014-03-18 21:36:27

标签: c

我收到公交车错误。

在调试下面的代码片段并踩到writeDmpFile的末尾时,我得到了:

writeDmpFile (tree=0x56a310, filename=0x7fffffffd450 "20140318.221058") at unzipper_m1.c:146
146 }
(gdb) n
Cannot access memory at address 0x38353031323236

虽然写了文件,但程序以总线错误结束。 代码如下:

typedef struct dmpParams_t
{
  char buff[6000000];
  size_t *size;
}dmpParams_t;

int writeFile(char *name,  unsigned char *buff, size_t *size,const char *dir )
{
  FILE * pFile;
  chdir (dir);
  pFile = fopen ( name, "wb");
  fwrite (buff , sizeof(unsigned char), *size, pFile);
  fclose (pFile);

  return 1;
}

int writeDmpFile(GTree *tree, char *filename)
{
  char dmpfilename[32];

  dmpfilename[0] ='\0';
  dmpParams_t params;
  params.buff[0]   ='\0';
  size_t size =0;
  params.size=&size ;
  g_tree_foreach(tree, (GTraverseFunc)writeDmpFileLine, &params);
  sprintf (dmpfilename, "InstrumentList_FULL.csv_%.*s", 15, filename);
  writeFile(dmpfilename,  ( unsigned char *)params.buff,  &size , dmpdir);//(size_t *)params.size, dmpdir);
}

1 个答案:

答案 0 :(得分:2)

它看起来像dmpfilename的缓冲区溢出。您分配了一个长度为32的数组。然后使用"InstrumentList_FULL.csv_%.*s"对其进行格式化。那个24个字符,加上15个文件名,加上一个空终止符。这超过了32个。

增加缓冲区的大小。

哦,dmpParams_t呃,相当大。当您将其中一个作为本地分配时,可能会出现堆栈溢出。

其他一些评论:

  1. 您可以更有用地使用const
  2. 在结构中将size声明为size_t*有点奇怪。您将结构的地址传递给g_tree_foreach。我将size声明为size_t并让g_tree_foreach修改该值。
  3. 同样,您将size的地址传递给writeFile似乎很奇怪。同样,const值似乎更有意义。