由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

链接地址: http://www.djcxy.com/p/64945.html

上一篇: stack smashing detected by valgrind

下一篇: Is getnameinfo memory leaking confirmed?