Life is a life... We are the humans...
Смотрите код:
#include <stdio.h>
int main () {
char p[1];
printf("Test:"
;
gets(p);
printf("%s\n",p);
return 0;
}
А теперь внимание, вопрос: сколько надо ввести символов чтобы получить переполнение???
#include <stdio.h>
int main () {
char p[1];
printf("Test:"

gets(p);
printf("%s\n",p);
return 0;
}
А теперь внимание, вопрос: сколько надо ввести символов чтобы получить переполнение???
gets() записывает строку + '\n' + '\0'
нда. второе предложение, как обычно, не дочитал =)
з.ы. не знаю как в лине, не компилил, а в bcc такого ответа сам не ждал...
while ((ch = _getchar_lk()) != '\n')
{
if (ch == _TEOF)
{
if (pointer == string)
{
retval = NULL;
goto done;
}
break;
}
*pointer++ = (_TCHAR)ch;
}
*pointer = _T('\0');
=)))
ты попробуй скомпиль )))
з.ы. как мне один тип говорил, "все крутые вещи делаются из консоли" ))
хм... по этой проге не видно... сказать ответ? 4 символа спокойно вводятся... на 5м вылетает виндовое окошко о недопустимой операции )) вот... а терь объясните почему )))
смотри асмный код - будет видно, в чем проблема. скорее всего, резервируется не один байт, а 4 (выравнивание). правда, тогда бы вылетало на 4-ом символе.
хм... попробуй задать char p[4]; переполнение на 26м...
з.ы. я Шилдту письмо написал... думаю ответит ))
хм... значит от среды зависит.. а в борландовском компилире в этой проге если выделить массив 4 символа то переполнение на 26м наступает )))
Для трейсинга некоректных обрашений к памяти используются окна ето области каторые прекрепляются к масиву с обоих концов
и так записана какая нить сигнатура при разрушении етой сигнатуры обработчик кучи ,в VC++ помоему на 100 обращении проводится такая проверка,проверяет нарушены ли сигнатуры или нет и если да то вылетакет ошибка есно размер окна и т д зависит от отладчика памяти ну и от среды.
это когда ты вылезешь за границы массива или когда тебе скажут "братец - ошибка тута, записать не могу"
это большая разница
и ещё: где именно вводить символы :
1) при работе программы в консоль
2) или учитавыть сам набор программы а также и ввод в консоль, а может и учитывать количество кликов
хотя второй вопрос немного идиотский Ж)
причем по разному можно вызвать окошко с ошибкой (.net 2002):
запуск F5 + Debug = 4 символа
запуск ctrl-А5 = 5 символов
Нафига писать ошибочные проги? Глючить они везде будут по разному
угу
radev, BrerRabbit, а вы умеете писать без ошибок?
ЗЫ всем разработчикам на Visual C++: читать http://rsdn.ru/article/vcpp/vcdebug-5.xml
Нафига писать заведомо ошибочные проги? Глючить они везде будут по разному
вы умеете писать без ошибок
а это возможно? Ж)
http://rsdn.ru/article/vcpp/vcdebug-5.xml --- нислабая статейка...
MrXaK поднял довольно актуалную тему отладки подобных ошибок, от которых никто не застрахован
таким образом встаёт вопрос : нафига вообще писать проги Ж)
the_fallen_angel
если отладка - процесс удаления ошибок, то программирование - процесс их внесения
и пасиба за статейку... очень хорошая))
падение стека, по идее, тебе должно было быть обеспечено.
ну просто до 5го введённого символа прога спокойно выдавала ответ(printf) и выходила... а после вылетало виндовое окошко (в ХР которое Отправить отчёт)...
я в память нелез, в асемблерный код тоже, но внешне до 5го символа никакого переполнения не было...
кстати если поставить sizeof то он при любых введёных символах выдаёт 1...
push ebp
mov ebp, esp
sub esp, @local_variables
ну или через enter - не принципиально
четыре байта могли всего-лишь разрушать значения ebp. не понятно только, как оно работало при 26 символах
по идее если она после описана в той же функции то должен дальше следом добавлять...