Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2012, 18:42   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
понятно что я залез на чужой участок памяти и пытался в нем изменить значение. но как виндос об этом узнает?
у вас виртуальное пространство, вы не можете залезть в чужое просто так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.08.2012, 19:05   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
у вас виртуальное пространство, вы не можете залезть в чужое просто так.
ТС просто не совсем точно выразился.

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

Автор имел ввиду: "как операционка узнает, о факте порчи памяти?"


Я точно не знаю, но подозреваю, что возможные механизмы контроля вшиваются в исполняемый код приложения, средствами компилятора.

В 2008 студии код вида:

Код:
int main()
{
    int a[10];
    a[11] = 1; //выход за пределы диапазона
}
Компилируется, и работает без ошибок рантайма

Однажды, в QtCreator в большом проекте, подобная ошибка привела его к поломке работы с сетью. В результате приложение выдавало что-то вроде "сервер не доступен". Было это в выходной день, и я реально даже подумал: "может они там сервак на выходные отключили?"

Я потратил несколько часов, что бы найти такую ошибку.

Последний раз редактировалось _Bers; 05.08.2012 в 19:22.
_Bers вне форума Ответить с цитированием
Старый 05.08.2012, 19:43   #13
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
понятно что я залез на чужой участок памяти и пытался в нем изменить значение. но как виндос об этом узнает?
Формально "чужой" памяти нет - все 4Г ваши но за пределы отпущеного вы не вылезете - "чужие" участки памяти защищены от доступа на уровне железа - операционке остается только ловить сигналы и убивать ваш процес. Когда вы вылезаете за "пределы" "вашей" памяти, операционке по барабану, т.е. она даже не пытается об этом узнавать.
waleri вне форума Ответить с цитированием
Старый 05.08.2012, 19:51   #14
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Формально "чужой" памяти нет - все 4Г ваши но за пределы отпущеного вы не вылезете - "чужие" участки памяти защищены от доступа на уровне железа - операционке остается только ловить сигналы и убивать ваш процес. Когда вы вылезаете за "пределы" "вашей" памяти, операционке по барабану, т.е. она даже не пытается об этом узнавать.
Интересно, а вот как вообще операционка узнает о том, что какой то процесс крякнул? Например, код приведенный автором топика через секунду приводит приложение к аварии, и оно закрывается.

Откуда операционка узнает, что данный процесс больше не работоспособный?
_Bers вне форума Ответить с цитированием
Старый 05.08.2012, 21:06   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
что какой то процесс крякнул?
срабытывает исключение общей защиты(или Page Fault, точно не помню) в процессоре, а система знает кому принадлежал квант времени.
Цитата:
Компилируется, и работает без ошибок рантайма
это в релизе.
а так, тут нет выхода за пределы страницы(минимальное выделение виртуальной памяти идет страницами), потому на самом деле не каждый левый указатель даст AV.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.08.2012, 21:22   #16
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
срабытывает исключение общей защиты(или Page Fault, точно не помню) в процессоре, а система знает кому принадлежал квант времени.
это в релизе.
а так, тут нет выхода за пределы страницы(минимальное выделение виртуальной памяти идет страницами), потому на самом деле не каждый левый указатель даст AV.
Да ну оно что в релизе, что в дебаге молчит. Смысл же не в том, что бы вылезти за пределы адресов доступных процессу. А в том, что можно черти что перезаписать по какому нибудь адресу. А потом что-то, где то поломается.
_Bers вне форума Ответить с цитированием
Старый 05.08.2012, 21:32   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Да ну оно что в релизе, что в дебаге молчит. Смысл же не в том, что бы вылезти за пределы адресов доступных процессу. А в том, что можно черти что перезаписать по какому нибудь адресу. А потом что-то, где то поломается.
ну там не куча, а стек, за пределы стека вы уж точно не вылазиете этим, а контроля то нету.
ОС, орет об AV если та страница недоступна, а вы туда пишете.
повреждения кучи ОС отследить не может в общем то.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.08.2012, 22:30   #18
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Интересно, а вот как вообще операционка узнает о том, что какой то процесс крякнул? Например, код приведенный автором топика через секунду приводит приложение к аварии, и оно закрывается.

Откуда операционка узнает, что данный процесс больше не работоспособный?
Потому что процесс начинает пытатся писать в "ничью" память. Пока вы пишите в свою память (хоть правильно, хоть нет, как в вашем) операционка обычно молчит. Некоторые компиляторы в debug режиме пишут в стек служебные cookies вокруг перемнных стека в каждом scope блоке. После каждоого вызова функции cookie проверяется и если оно испорчено тоже вылезет ошибка (но не ошибка ОС). Проблема в том, что если вы выйдете слишком далеко за пределы памяти (наприомер *через* один елемент масива, как в вашем случае) cookie останется целым и механизм защиты не сработает.

Вообще что такое "крякнул" - пока вы пишете в память, которая никем не исползуется проблем собственно нет, проблемы начинаются, когда вы пишете в чужую память. Мне случалось вызывать проверку кучи после *каждой* операции с указателем и/или вызова фунцкии меняющей память, лиш бы поймать момент.
waleri вне форума Ответить с цитированием
Старый 05.08.2012, 22:51   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Вообще что такое "крякнул" - пока вы пишете в память, которая никем не исползуется проблем собственно нет, проблемы начинаются, когда вы пишете в чужую память. Мне случалось вызывать проверку кучи после *каждой* операции с указателем и/или вызова фунцкии меняющей память, лиш бы поймать момент.
какая нафиг чужая память?
у нас виртуальная память, деленная на страницы.

есть три вида страниц(ну их больше, но интересует лишь три):
1)доступная на запись/чтение, в них пишем и читаем все ок.
2)доступная на чтение, при попытке записи будет AV.
3)не распределенная(или системная), при любом доступе будет AV.
Цитата:
Откуда операционка узнает, что данный процесс больше не работоспособный?
в коде ТС мы обращаемся к какому попало адресу(ибо стековая переменная).
попадая на страницу 2/3 процессор генерирует исключение(по точнее могу вычитать в принципе), по нему ОС знает кто/куда.
ну и прибивает процесс.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 05.08.2012 в 22:57.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.08.2012, 23:35   #20
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

"чужая паметь" - та, которую не мы выделили...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Безопасность e_e_n Безопасность, Шифрование 40 03.09.2010 01:11
Безопасность x_AN777 Помощь студентам 2 08.05.2010 23:30
Безопасность xap4o PHP 4 15.02.2010 00:02