Официальный сайт студ.городка НГТУ
Программирование и БД » [c++]крах стека вокруг переменной 

#1  01.06.09 23:30

[c++]крах стека вокруг переменной

Run-Time Check Failure #2 - Stack around the variable 'priority_str' was corrupted.

Проблема возникает когда прога выходит за границы массива priority_str. Можно как то обработать эту ошибку? а то что-то не охота проверять заполнение.

Offline

#2  01.06.09 23:35

Re: [c++]крах стека вокруг переменной

оборачивай в try {} catch

Offline

#3  02.06.09 00:18

Re: [c++]крах стека вокруг переменной

не ловит. указывает на закрывающую скобку функции и выдает ошибку

Offline

#4  02.06.09 00:49

Re: [c++]крах стека вокруг переменной

ЙожжЫк написал(а):

не ловит. указывает на закрывающую скобку функции и выдает ошибку

Может хоть код покажешь, а то телепатыто все в отпуске..

Offline

#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

#6  02.06.09 08:05

Re: [c++]крах стека вокруг переменной

ЙожжЫк написал(а):

Run-Time Check Failure #2

это что, богомерзкий CLI?

а так вообще нужно запустить в отладчике и посмотреть, каких значений достигают переменные *_с

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

#9  02.06.09 14:41

Re: [c++]крах стека вокруг переменной

Kosh_Mar, наверно лучше.. ну а как же лишние байты, выделенные под массивы? )) да и перехват этой ошибки избавил бы от необходимости проверять синтаксис строки.. будем расширять..

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

Re: [c++]крах стека вокруг переменной

"Run-Time Check Failure #2" - это точно исключение, которое можно перехватить?

Offline

#13  02.06.09 19:10

Re: [c++]крах стека вокруг переменной

Jaguar, там нет rule[-1] , так как есть условие i!=0.
и там я тоже ставил трай, тока все равно не ловит.

"Run-Time Check Failure #2" - это точно исключение, которое можно перехватить?

вот это и интересует..

Offline

#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

Re: [c++]крах стека вокруг переменной

Jaguar, ну да может быть. но все же проблема не этим вызывалась. пришлось проверять массивы на заполненность

Offline

#16  02.06.09 20:38

Re: [c++]крах стека вокруг переменной

Jaguar написал(а):

нет конечно... это, я так понимаю, ошибка после линковки, которое старательно генерит вс2008...

к сожалению, такое кунфу я знаю плохо
но это именно в процессе выполнения вылетает, т.е. что-то вроде проверки guard bytes

Offline

#17  02.06.09 21:43

Re: [c++]крах стека вокруг переменной

Matrim, vs посл линковки вгружает код в память и делает контрольные проверки... если там проблемы, то будет так писать... но если обернуть всю функцию в try, то должно перехватить такое исключение....

ЙожжЫк, я и не говорю, что именно этим... просто у тебя там такой бедлам, что "утечка" может произойти от чего угодно... говорю, ты проверь свой алгоритм вручную на бумаге...

Offline

#18  02.06.09 22:28

Re: [c++]крах стека вокруг переменной

Jaguar, он прекрасно работает, но если входная строка rule не такого вида как надо, то в строку priority_str записывается больше чем надо, отсюда косяк. просто хотел траем перехватить, но пришлось контролировать. впрочем может так и лучше

Offline

#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

Re: [c++]крах стека вокруг переменной

Тогда проверь, инциализирован ли этот указатель NULL'ом в конструкторе.

Offline

#23  07.06.09 15:04

Re: [c++]крах стека вокруг переменной

да, вот это я и забыл. спасибо

Offline

#24  10.06.09 14:19

$up
Профиль

Re: [c++]крах стека вокруг переменной

эх, как же я привык к отформатированному по стандарту коду...
На твоём коде даже глаза разбегаются. Просто несколько советов.
Попробуй испльзовать std контейнеры, это облегчит тебе жизнь.
Проверяй входные параметры функции на допустимые значения.
Разбивай большую функцию на более мелкие.
Придерживайся хоть какой-нибудь нотации в именах переменных.
Поставь VisualAssist.
Посылай всех к чёрту с такими советами 8)

Offline

Программирование и БД » [c++]крах стека вокруг переменной 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.170 сек.
Выполнено 14 запросов.