#5 02.06.09 01:10
Re: [c++]крах стека вокруг переменной
Код: cpp:
bool ReadFirewallRule(wchar_t *rule,wchar_t *ruletype,wchar_t *proto,wchar_t *ipfrom,wchar_t *portfrom,wchar_t *ipto,wchar_t *portto,int &priority) { //несущественный код... int priority_c=0; wchar_t priority_str[10]; for(int i=0;rule[i]!=0;i++) //rule string analysis { if(rule[i]=='*' || rule[i]=='x' || (rule[i]==' ' && rule[i+1]=='/')) return false; if(i!=0 && rule[i-1]!=' ' && rule[i-1]!='>' /*&& rule[i-1]!=':'*/ && rule[i-1]!='\t') if(rule[i]==' ' || rule[i]=='-' /*|| rule[i]==':'*/ || rule[i-1]=='\t') order++; if(rule[i]!=' ' && rule[i]!='-' && rule[i]!='>' /*&& rule[i]!=':'*/ && rule[i-1]!='\t') { try{ if(order==0) { ruletype[ruletype_c]=rule[i]; ++ruletype_c; } else if (order==1) { proto[proto_c]=rule[i]; ++proto_c; } else if (order==2) if(rule[i] == '[') { i++; for(; rule[i] != ']'; i++) { ipfrom[ipfrom_c] = rule[i]; ++ipfrom_c; } i++; } else { ipfrom[ipfrom_c] = rule[i]; ++ipfrom_c; } else if (order==3) { portfrom[portfrom_c]=rule[i]; ++portfrom_c; } else if (order==4) if(rule[i] == '[') { for(; rule[i] != ']'; i++) { ipto[ipto_c] = rule[i]; ++ipto_c; } i++; } else { ipto[ipto_c] = rule[i]; ++ipto_c; } else if (order==5) { portto[portto_c]=rule[i]; ++portto_c; } else if (order==6)//здесь заполняется массив и выходит за границу { priority_str[priority_c]=rule[i]; ++priority_c; } } catch(...) { wchar_t buff[256],buff2[10]; _wstrtime(buff2); buff[0]=0; swprintf(buff,L"[%s]Брандмауэр s - неизвестная ошибка в правиле d\n",buff); WriteErrLog(buff); //glob_err_flag=true; return false; } } } ruletype[ruletype_c]=0; proto[proto_c]=0; ipfrom[ipfrom_c]=0; portfrom[portfrom_c]=0; ipto[ipto_c]=0; portto[portto_c]=0; priority_str[priority_c]=0; //check rule if(ruletype_c==0 || proto_c==0 || ipfrom_c==0 || portfrom_c==0 || ipto_c==0 || portto_c==0 || priority_c==0) return false; if(_wcsicmp(ruletype,L"block")!=0 && _wcsicmp(ruletype,L"pass")!=0) return false; if(_wcsicmp(proto,L"tcp")!=0 && _wcsicmp(proto,L"udp")!=0 && _wcsicmp(proto,L"smtp")!=0 && _wcsicmp(proto,L"any")!=0) return false; //вот тут ниже, при входе в функцию выдает ошибку. от функции не зависит, видимо важен сам //факт перехода в другое место if(_wcsicmp(portfrom, L"any") != 0) if(!Port::Check(portfrom)) return false; if(_wcsicmp(portto, L"any") != 0) if(!Port::Check(portto)) return false; priority=_wtoi(priority_str); if(priority == 0) return false; if(_wcsicmp(ipfrom,L"any")!=0 && !CheckIP(ipfrom)) return false; if(_wcsicmp(ipto,L"any")!=0 && !CheckIP(ipto)) return false; return true; }//вот здесь ставить вс2008 стрелку и пишет об ошибке
надо как-нить перехватить ошибку, чтоб остановить выполнение
Offline
#7 02.06.09 13:48
Re: [c++]крах стека вокруг переменной
Matrim написал(а):
это что, богомерзкий CLI?
видимо чего-то я не знаю..
Matrim написал(а):
а так вообще нужно запустить в отладчике и посмотреть, каких значений достигают переменные *_с
некоторые из них превышают допустимые, вследствие того, что строка rule составлена неправильно. вот в таких случаях и возникает ошибка. при вызове метода Check возникает ошибка с priority_str, нажимаем ф5, в этом методе тоже возникает, вследствие переполнения portfrom или portto. такое может быть со всеми массивами. меня интересует, можно как-то перехватить эти ошибки?
Offline
#8 02.06.09 14:30
Re: [c++]крах стека вокруг переменной
Я может быть отстаю от современности, но разве не лучше сразу писать так, чтобы не было никаких переполнений? И если пользуешься статическим массивом, постараться, чтобы ее хватало на большинство случаев и чтобы при заполнении была проверка на возможное переполнение?
Уметь красиво использовать исключения - редкость.
Offline
#10 02.06.09 15:17
Re: [c++]крах стека вокруг переменной
ЙожжЫк, ты не в том месте пытаешься поймать ошибку... ты как в том анекдоте "вы где потеряли паспорт; вон там; а чего тут под фанарем тогда его ищете?; а тут светлее"...
Код: cpp:
bool ReadFirewallRule(wchar_t *rule,wchar_t *ruletype,wchar_t *proto,wchar_t *ipfrom,wchar_t *portfrom,wchar_t *ipto,wchar_t *portto,int &priority) { try { // тут текст твоей функции, который вызывает исключение } catch (Exception *e) // сообщение об исключении // че-нить типа такого: Console::WriteLine("An error occurred."); Console::WriteLine(e->Message); // Print the error message. Console::WriteLine(e->StackTrace); //String that contains the stack trace for this exception. } }
Исправлено Jaguar (02.06.09 15:18)
Offline
#11 02.06.09 15:20
Re: [c++]крах стека вокруг переменной
и еще... я бы тебе посоветовал самому пройтись по циклу два-три раза (на бумажке желательно, а не в уме), и проставить в каждом конкретном месте чему равны у тебя переменные... думаю, rule[-1] не должен "существовать", но у тебя как-то это "работает"...
Offline
#12 02.06.09 17:20
#13 02.06.09 19:10
#14 02.06.09 20:09
Re: [c++]крах стека вокруг переменной
ЙожжЫк написал(а):
там нет rule[-1] , так как есть условие i!=0.
это ты про первое-то условие? а это?:
ЙожжЫк написал(а):
if(rule[i]!=' ' && rule[i]!='-' && rule[i]!='>' /*&& rule[i]!=':'*/ && rule[i-1]!='\t')
вот это у тебя вполне вероятно способно "дойти" до последней проверки при i=0
Matrim написал(а):
"Run-Time Check Failure #2" - это точно исключение, которое можно перехватить?
нет конечно... это, я так понимаю, ошибка после линковки, которое старательно генерит вс2008...
Offline
#15 02.06.09 20:22
#16 02.06.09 20:38
#17 02.06.09 21:43
Re: [c++]крах стека вокруг переменной
Matrim, vs посл линковки вгружает код в память и делает контрольные проверки... если там проблемы, то будет так писать... но если обернуть всю функцию в try, то должно перехватить такое исключение....
ЙожжЫк, я и не говорю, что именно этим... просто у тебя там такой бедлам, что "утечка" может произойти от чего угодно... говорю, ты проверь свой алгоритм вручную на бумаге...
Offline
#18 02.06.09 22:28
#19 06.06.09 00:36
Re: [c++]крах стека вокруг переменной
Код::
Rule::~Rule(void)
{
try{
delete this->next;
delete from;
delete to;
*status = NULL;
*protocol = NULL;
priority = 0;
}
catch(...)
{
MessageBox(NULL,L"Error!!!",L"Error",MB_OK|MB_ICONEXCLAMATION);
}
}delete this->next; выдает ошибку "Нарушение прав доступа при чтении". почему кэтч не ловит? или в деструкторе нельзя так?
Offline
#20 07.06.09 00:24
Re: [c++]крах стека вокруг переменной
Похоже, что ты пытаешься удалить то, что уже удалено. Исключение при этом брошено не будет, вот оно и не ловится. Проверь, нет ли двойного удаления. У тебя объекты Rule копируются где-нибудь? Присваиваются один другому? Операторы присваивания и копирования правильно реализованы?
Исправлено dRew (07.06.09 00:30)
Offline
#21 07.06.09 01:56
Re: [c++]крах стека вокруг переменной
нету ничего там такого. и вс пишет, что необработанное исключение. это скорее попытка удалить, то чего нет (указатель на следующий элемент списка, которого нет или попросту конец списка). пытался проверять так:
Код::
if(this->next !=NULL)
вместо try, но тоже необработанное исключение
Offline
#22 07.06.09 12:22
#23 07.06.09 15:04
#24 10.06.09 14:19
Re: [c++]крах стека вокруг переменной
эх, как же я привык к отформатированному по стандарту коду...
На твоём коде даже глаза разбегаются. Просто несколько советов.
Попробуй испльзовать std контейнеры, это облегчит тебе жизнь.
Проверяй входные параметры функции на допустимые значения.
Разбивай большую функцию на более мелкие.
Придерживайся хоть какой-нибудь нотации в именах переменных.
Поставь VisualAssist.
Посылай всех к чёрту с такими советами 8)
Offline

