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