С записью в области памяти, в которые в текущий момент писать нельзя
> int _tmain(int argc, _TCHAR* argv[]) > { > char* tst = (char*)0x11FFF;// ok > char* tst2 = (char*)0x12000;// <BadPtr> > > *tst = (int)0; // ок — не ок, а стрельба по памяти (запортили чего-то). > *tst2 = (int)0; // Unhandled exception at 0x00411c45 ...: 0xC0000005: Access violation writing location 0x00012000. — а тут повезло больше, в память по этому адресу писать нельзя. Поэтому про ошибку узнали сразу, а не через 3 дня отладки > > return 0; > } > > Компилятор — MS.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S>С записью в области памяти, в которые в текущий момент писать нельзя
Ну, это да, понятно из исключения.
Вопрос в том, почему именно эта величина указателя — 0x12000
Насчет указателя tmp (0x11FFF) — почему в эту область памяти писать можно?
И еще такой вопрос: эта ведь память в куче не выделялась... получается, что эта память (0x11FFF) была выделена на стеке функции _tmain или необязательно?
Ведь по указателю tmp все-таки можно записать 0...
Здравствуйте, SQLBeginner, Вы писали:
SQL>Насчет указателя tmp (0x11FFF) — почему в эту область памяти писать можно?
То что не вылетел AV не значит что можно . Просто это великий Undefined Behavior, иными словами — такой код может привести к чему угодно. И не надо строить никаких предположений — можно, нельзя, на стеке, не на стеке...
Если человеку ржавым ножом отрезать руку, то он тоже может умереть (от потери крови, от ужаса, от заражения крови или еще от чего...) а может и не умереть. Так и получается Ваш вопрос — "почему правую руку отрезать можно, а левую нет?". Вывод — не надо так делать.
> Ну, это да, понятно из исключения. > Вопрос в том, почему именно эта величина указателя — 0x12000
А это как фишка ляжет Например, это могла оказаться вершина стека.
> Насчет указателя tmp (0x11FFF) — почему в эту область памяти писать можно?
Таким образом туда писать тоже нельзя. Просто система это не может отловить.
> И еще такой вопрос: эта ведь память в куче не выделялась... получается, что эта память (0x11FFF) была выделена на стеке функции _tmain или необязательно?
Не обязательно, хотя и весьма вероятно.
> Ведь по указателю tmp все-таки можно записать 0...
"можно" в данном случае означает только отсутствие диагностики проблемы. Если вас сильно интересует, какие области памяти программы можно затирать подобным образом, вызовите VirtualQuery для каждой страницы памяти.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S>"можно" в данном случае означает только отсутствие диагностики проблемы. Если вас сильно интересует, какие области памяти программы можно затирать подобным образом, вызовите VirtualQuery для каждой страницы памяти.
Спасибо! В связи с этим вопросом — кто осуществляет проверку памяти на доступность?
Можно ли где-нибудь почитать?
>S>"можно" в данном случае означает только отсутствие диагностики проблемы. Если вас сильно интересует, какие области памяти программы можно затирать подобным образом, вызовите VirtualQuery для каждой страницы памяти. > > Спасибо! В связи с этим вопросом — кто осуществляет проверку памяти на доступность?
Непосредственно проверку осуществляет процессор. А чего при этом делать, решает уже ОС или кто там страничную адресацию настраивал (DOS-экстендер например или вообще BIOS — на ранних этапах инициализации системы.
> Можно ли где-нибудь почитать?
Если про самый нижний уровень — то доку по 80386 и/или более поздним процессорам. Если про то, как это устроено в винде — то например MSDN, запомнив предварительно, что минимальной защищаемой единицей является страница памяти.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S>Если про самый нижний уровень — то доку по 80386 и/или более поздним процессорам. Если про то, как это устроено в винде — то например MSDN, запомнив предварительно, что минимальной защищаемой единицей является страница памяти.