Валгринд обнаружил разрушение стека

разрушение стека обнаруживается в моей основной функции в коде 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) Прервано (ядро выгружено)

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

0

Решение

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

1

Другие решения


По вопросам рекламы [email protected]