Инициализация памяти в malloc
Цитата:
В принципе этот вопрос важен как для Linux (ту может что-то в ядре найду, так и для Windows - тут я даже не знаю что сказать). Где-нибудь это может быть официально описано ? Что-бы "сослаться на официальный документ" Опытным путём установил в Linux - первоначально выделяется пустая память, а дальше в ней то, что я сам положил. т.е. я имею ввиду цикл : p1=p=malloc(N) <проверил - Тут в p* нули> <заполняю единицами> free(p) p2=p=malloc(N) (заодно проверил, что p1==p2) <Тут в P* единицы> free(p) |
про выделение памяти (Windows or Linux), и про то как это можно использовать в не в полне благонадежных целях была неплохая статья в Хакер'е (страниц десять)... если мне не изменяет память, в 2003 году... что-то там в названии было про HEAP...
|
>> первоначально выделяется пустая память
Насколько мне известно, содержимое памяти после malloc и realloc (в "добавленной" части) вообще не предопределено. И совершенно непредсказуемо, что там будет записано. Поэтому у меня лично есть "манечка" делать memset(p,s,0) даже после calloc и new[]. Так что да, думаю что там могут (после malloc) оказаться данные чужой программы. |
вообще мне казалось так: (цитирую кусок из разговора по аське с ruslandh)
"вообще на С действительно определяется место, выделяется объем, заполняется. Дальще можно со всем этим хозяйством работать через указатели. Увидеть значения другой задачи нельзя при нормальном разделении памяти под задачи. (В старых версиях виндов, насколько я понимаю, этого не было). Кроме того, в тех же виндах (по XP включительно) для приложений уровня драйверв доступны все дескрипторные таблицы (не только своих задач ). В юниксах такого маразма (вроде бы) нет, но возможны ошибки, дающие возможность почитать память откуда не полагается.\x0d\nПро malloc лучше всего, скорей всего, в \"Ветхом завете\" :) - сиречь у Кернигшана и Ричи." То есть имхо: содержимое не предопределено, предопределен (нами) размер содержимого, а за разделение памяти между задачами и процессами отвечает система. |
mar
До меня как-то не сразу дошло, получается что ruslandh в самом первом сообщении темы спрашивает, можно ли получить кусок памяти из работающего чужого приложения? Нет, конечно - сразу схлопочем memory access violation. Когда я говорил, что можно получить кусок с данными чужой программы через malloc, я имел в виду, что мы получаем мусор, уже отработанную кем-то память, помеченную в системных ресурсах как свободную для использования, но не зачищенную (ибо зачем?) при предоставлении нашей задаче. Это и только это я имел в виду. О таблицах дескрипторов речи нет. Или там о зачистке памяти из BSS-секции... :] |
hasherfrog
до меня тоже только сейчас дошло: действительно, если задача такая, что ее данные не стоит никому показывать, даже кусками после отработки, то надо, видимо, не просто "уничтожать" выделенную область, но предварительно чистить, заполняя все куски памяти чем-нибудь однородным. |
Интересно, то, что "погоняв" эту программульку, я, насколько мог убедился, что при первом выделении памяти через malloc - память всегда нулевая, а потом можно видеть свой "муссор" (если-бы это был кусочек вируса, то да :) ) , также память нулевая, если запрашивается больше определённого размера K.
|
а можно вообще всю память посмотреть в /dev/mem... тока прова рута нужны %)
|
Время: 04:36. |
Время: 04:36.
© OSzone.net 2001-