由valgrind检测到堆栈粉碎
在c ++代码中我的主函数中检测到堆栈粉碎...这里是main的主体:
int main()
{
long int acn;
char dot[15];
float open_balance=1;
char k;
int total_account=0;
int c;
static int ac=10000;
TRANSACTION trn;
support sprt;
do{
cout<<"n1.New accountn2. Transactionn3. ExitnnEnter choice:";
cin>>k;
switch(k) {
case '1':
ac+=1;
time_t rawtime;
time(&rawtime);
strcpy(dot,ctime(&rawtime));
do{
if(open_balance<=0)
cout<<"Opening BALANCE can not be less than zero";
cout<<"nEnter the opening balance :";
cin>>open_balance;
}while(open_balance<=0);
bln[total_account].get_data(ac,open_balance,dot);
++total_account;
break;
case '2':
trn.trans(total_account);
break;
case '3': break;
default :
cout<<"nWrong choice!!";
}
}while(k!='3');
cout<<"Thank you";
return(0);
}
当我通过valgrind运行代码时,它也发现堆栈粉碎但无法找到任何内存泄漏。 valgrind报告:
1.新账户2.交易3.退出
输入选项:3 *堆栈粉碎检测* :./a.out终止谢谢== 9813 ==
== 9813 ==总结:
== 9813 ==在退出时使用:0个字节0个字节
== 9813 ==总堆使用率:10个分配,10个释放,954个字节分配
== == 9813
== 9813 ==所有堆块都被释放 - 没有泄漏是可能的
== == 9813
== 9813 ==对于检测和抑制错误的计数,请重新运行:-v
== 9813 ==错误摘要:来自0个上下文的0个错误(被抑制:0从0)中止(核心转储)
我哪里错了?
它是行strcpy(dot,ctime(&rawtime));
导致堆栈sme。。
函数ctime
返回一个类似于"Wed Jun 30 21:49:08 1993n"
的字符串,其长度超过15个字节,并且需要更多字节来存储ctime
的结果。
strcpy
不检查目标内存的边界,所以它被认为是危险的,建议替代strncpy
。 而且,如果您的程序运行多个线程,则首选ctime_r
。