Обнаружение клака

разбиение стека обнаруживается в моей основной функции в коде 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 == HEAP РЕЗЮМЕ:

== 9813 == используется при выходе: 0 байт в 0 блоках

== 9813 == Общее использование кучи: 10 распределений, 10 разрядов, выделено 954 байт

== 9813 ==

== 9813 == Все блоки кучи были освобождены - утечки не возможны

== 9813 ==

== 9813 == Для подсчета обнаруженных и подавленных ошибок повторите попытку с помощью -v

== 9813 == ОШИБКА РЕЗЮМЕ: 0 ошибок из 0 контекстов (подавлено: 0 из 0) Aborted (core dumped)

Где я иду не так?

1 ответ

это строка strcpy(dot,ctime(&rawtime)); что вызывает смешение стека. Функция ctime возвращает строку подобно "Wed Jun 30 21:49:08 1993\n", ее длина более 15 байт, и вам нужно больше байтов для хранения результата ctime. strcpy не проверяет маржу целевой памяти, поэтому считается опасной, вместо нее предлагается альтернативная strncpy. И если ваша программа запускает более одного потока, предпочтительнее ctime_r.

licensed under cc by-sa 3.0 with attribution.