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;

}





А теперь внимание, вопрос: сколько надо ввести символов чтобы получить переполнение???

Комментарии
12.01.2005 в 18:20

0 :)

gets() записывает строку + '\n' + '\0'
12.01.2005 в 18:29

Life is a life... We are the humans...
а терь попробуй скомпиль и проверь )))
12.01.2005 в 18:30

Life is a life... We are the humans...
ответ неожиданный будет... ))
12.01.2005 в 18:39

...The line consists of all characters up to and including the first newline character ('\n'). gets then replaces the newline character with a null character ('\0') before returning the line.



нда. второе предложение, как обычно, не дочитал =)

12.01.2005 в 18:41

Life is a life... We are the humans...
ну всё равно... попробуй скомпиль и ответь сколько символов надо ввести... не считая символ новой строки... всё равно ответ будет неожиданный...

з.ы. не знаю как в лине, не компилил, а в bcc такого ответа сам не ждал...
12.01.2005 в 18:42

и, вообще, консоль - это не модно ;)
12.01.2005 в 18:48

любой введенный символ (не считая ENTER) рушит стек:



while ((ch = _getchar_lk()) != '\n')

{

if (ch == _TEOF)

{

if (pointer == string)

{

retval = NULL;

goto done;

}



break;

}



*pointer++ = (_TCHAR)ch;

}



*pointer = _T('\0');
12.01.2005 в 18:48

Life is a life... We are the humans...
dermeister

=)))

ты попробуй скомпиль )))

з.ы. как мне один тип говорил, "все крутые вещи делаются из консоли" ))
12.01.2005 в 18:50

Life is a life... We are the humans...
dermeister

хм... по этой проге не видно... сказать ответ? 4 символа спокойно вводятся... на 5м вылетает виндовое окошко о недопустимой операции )) вот... а терь объясните почему )))
12.01.2005 в 18:56

проверено в Visual C++ (Microsoft Visual Studio 2003).

смотри асмный код - будет видно, в чем проблема. скорее всего, резервируется не один байт, а 4 (выравнивание). правда, тогда бы вылетало на 4-ом символе.

12.01.2005 в 19:02

Life is a life... We are the humans...
dermeister

хм... попробуй задать char p[4]; переполнение на 26м...

з.ы. я Шилдту письмо написал... думаю ответит ))
12.01.2005 в 19:07

в Visual C++ (Microsoft Visual Studio 2003) все работает корректно
12.01.2005 в 19:10

Life is a life... We are the humans...
dermeister

хм... значит от среды зависит.. а в борландовском компилире в этой проге если выделить массив 4 символа то переполнение на 26м наступает )))
13.01.2005 в 00:22

Все дело в отладчике памяти.

Для трейсинга некоректных обрашений к памяти используются окна ето области каторые прекрепляются к масиву с обоих концов

и так записана какая нить сигнатура при разрушении етой сигнатуры обработчик кучи ,в VC++ помоему на 100 обращении проводится такая проверка,проверяет нарушены ли сигнатуры или нет и если да то вылетакет ошибка есно размер окна и т д зависит от отладчика памяти ну и от среды.
13.01.2005 в 10:24

Поиск ошибок при работе с памятью (Visual C++): http://rsdn.ru/article/vcpp/vcdebug-5.xml
13.01.2005 в 13:03

Нафига писать ошибочные проги? Глючить они везде будут по разному :)
13.01.2005 в 13:32

а что значит переполнение???

это когда ты вылезешь за границы массива или когда тебе скажут "братец - ошибка тута, записать не могу"

это большая разница



и ещё: где именно вводить символы :

1) при работе программы в консоль

2) или учитавыть сам набор программы а также и ввод в консоль, а может и учитывать количество кликов

хотя второй вопрос немного идиотский Ж)



причем по разному можно вызвать окошко с ошибкой (.net 2002):

запуск F5 + Debug = 4 символа

запуск ctrl-А5 = 5 символов



Нафига писать ошибочные проги? Глючить они везде будут по разному

угу
13.01.2005 в 13:40

хорошие грабли со временем не тупятся
Нафига писать ошибочные проги? Глючить они везде будут по разному

radev, BrerRabbit, а вы умеете писать без ошибок? ;)



ЗЫ всем разработчикам на Visual C++: читать http://rsdn.ru/article/vcpp/vcdebug-5.xml
13.01.2005 в 13:43

поправлюсь

Нафига писать заведомо ошибочные проги? Глючить они везде будут по разному



вы умеете писать без ошибок

а это возможно? Ж)



http://rsdn.ru/article/vcpp/vcdebug-5.xml --- нислабая статейка...
13.01.2005 в 13:47

хорошие грабли со временем не тупятся
BrerRabbit, а ты умеешь писать заведомо безошибочные проги? :D



MrXaK поднял довольно актуалную тему отладки подобных ошибок, от которых никто не застрахован
13.01.2005 в 13:48

the_fallen_angel LOL



таким образом встаёт вопрос : нафига вообще писать проги Ж)
13.01.2005 в 13:51

хорошие грабли со временем не тупятся
если отладка - процесс удаления ошибок, то программирование - процесс их внесения :-D
13.01.2005 в 17:04

Life is a life... We are the humans...
вообще я поднял эту тему потому что не понял почему тут переполнение не после 1го символа наступает )))



the_fallen_angel

если отладка - процесс удаления ошибок, то программирование - процесс их внесения :lol:

и пасиба за статейку... очень хорошая))

13.01.2005 в 17:15

хорошие грабли со временем не тупятся
а как, собственно, переполнение должно было себя проявить?

падение стека, по идее, тебе должно было быть обеспечено.
13.01.2005 в 17:24

Life is a life... We are the humans...
the_fallen_angel

ну просто до 5го введённого символа прога спокойно выдавала ответ(printf) и выходила... а после вылетало виндовое окошко (в ХР которое Отправить отчёт)...
13.01.2005 в 17:25

Life is a life... We are the humans...
the_fallen_angel

я в память нелез, в асемблерный код тоже, но внешне до 5го символа никакого переполнения не было...

кстати если поставить sizeof то он при любых введёных символах выдаёт 1...
13.01.2005 в 17:35

возможно это объясняется созданием стекового кадра:



push ebp

mov ebp, esp

sub esp, @local_variables



ну или через enter - не принципиально

четыре байта могли всего-лишь разрушать значения ebp. не понятно только, как оно работало при 26 символах :upset:
13.01.2005 в 17:46

Life is a life... We are the humans...
самое интересное я про ebp тоже думал.. .но по идее если потом объявить ещё одну переменную то ebp ведь будет занят... а переполнение всё равно на 5м...
13.01.2005 в 17:52

смотря куда компилятор добавляет еще одну переменную - если к меньшим адресам, то это никак не влияет на затирание ebp
13.01.2005 в 18:22

Life is a life... We are the humans...
dermeister

по идее если она после описана в той же функции то должен дальше следом добавлять...