我收到公交车错误。
在调试下面的代码片段并踩到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, ¶ms);
sprintf (dmpfilename, "InstrumentList_FULL.csv_%.*s", 15, filename);
writeFile(dmpfilename, ( unsigned char *)params.buff, &size , dmpdir);//(size_t *)params.size, dmpdir);
}
答案 0 :(得分:2)
它看起来像dmpfilename
的缓冲区溢出。您分配了一个长度为32的数组。然后使用"InstrumentList_FULL.csv_%.*s"
对其进行格式化。那个24个字符,加上15个文件名,加上一个空终止符。这超过了32个。
增加缓冲区的大小。
哦,dmpParams_t
呃,相当大。当您将其中一个作为本地分配时,可能会出现堆栈溢出。
其他一些评论:
const
。size
声明为size_t*
有点奇怪。您将结构的地址传递给g_tree_foreach
。我将size
声明为size_t
并让g_tree_foreach
修改该值。size
的地址传递给writeFile
似乎很奇怪。同样,const值似乎更有意义。