0

C++コードのメイン関数でスタック破壊が検出されました...メインの本体は次のとおりです。

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 account\n2. Transaction\n3. Exit\n\nEnter 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) 中止 (コア ダンプ)

どこが間違っているのですか?

4

1 に答える 1

1

strcpy(dot,ctime(&rawtime));スタックスメッシングを引き起こすのはその行です。
関数ctimeは同様の文字列を返します"Wed Jun 30 21:49:08 1993\n"。その長さは 15 バイトを超えており、 の結果を保存するにはさらにバイトが必要ですctime
strcpyターゲットメモリのマージンをチェックしないため、危険と見なされ、代わりに代替案strncpyが提案されます。また、プログラムが複数のスレッドを実行する場合は、ctime_rが優先されます。

于 2014-10-24T08:32:47.700 に答える