Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование в *nix (http://forum.oszone.net/forumdisplay.php?f=35)
-   -   Инициализация памяти в malloc (http://forum.oszone.net/showthread.php?t=50207)

ruslandh 08-06-2005 01:48 330901

Инициализация памяти в malloc
 
Цитата:

Цитата man malloc
malloc() выделяет size байт и возвращает указатель на
выделенную
память. Выделенная память не инициализируется.

free() освобождает область памяти, на которую указывает pt
r, которая
быть выделена ранее посредством malloc(), calloc() или
realloc().

У меня ещё один вопрос по "программированию" образовался - функция malloc выделяет память из "кучи", можно-ли с её помощью увидеть какие-то "значения" другой задачи (из сферы безопасности и защиты от взлома).
В принципе этот вопрос важен как для Linux (ту может что-то в ядре найду, так и для Windows - тут я даже не знаю что сказать).

Где-нибудь это может быть официально описано ? Что-бы "сослаться на официальный документ"
Опытным путём установил в Linux - первоначально выделяется пустая память, а дальше в ней то, что я сам положил.

т.е. я имею ввиду цикл :

p1=p=malloc(N)
<проверил - Тут в p* нули>
<заполняю единицами>
free(p)
p2=p=malloc(N)
(заодно проверил, что p1==p2)
<Тут в P* единицы>
free(p)

Demiurg 01-08-2005 09:59 345047

про выделение памяти (Windows or Linux), и про то как это можно использовать в не в полне благонадежных целях была неплохая статья в Хакер'е (страниц десять)... если мне не изменяет память, в 2003 году... что-то там в названии было про HEAP...

hasherfrog 01-08-2005 10:32 345062

>> первоначально выделяется пустая память

Насколько мне известно, содержимое памяти после malloc и realloc (в "добавленной" части) вообще не предопределено. И совершенно непредсказуемо, что там будет записано. Поэтому у меня лично есть "манечка" делать memset(p,s,0) даже после calloc и new[]. Так что да, думаю что там могут (после malloc) оказаться данные чужой программы.

mar 04-08-2005 20:13 345976

вообще мне казалось так: (цитирую кусок из разговора по аське с ruslandh)
"вообще на С действительно определяется место, выделяется объем, заполняется. Дальще можно со всем этим хозяйством работать через указатели. Увидеть значения другой задачи нельзя при нормальном разделении памяти под задачи. (В старых версиях виндов, насколько я понимаю, этого не было). Кроме того, в тех же виндах (по XP включительно) для приложений уровня драйверв доступны все дескрипторные таблицы (не только своих задач ). В юниксах такого маразма (вроде бы) нет, но возможны ошибки, дающие возможность почитать память откуда не полагается.\x0d\nПро malloc лучше всего, скорей всего, в \"Ветхом завете\" :) - сиречь у Кернигшана и Ричи."
То есть имхо: содержимое не предопределено, предопределен (нами) размер содержимого, а за разделение памяти между задачами и процессами отвечает система.

hasherfrog 04-08-2005 23:27 346004

mar
До меня как-то не сразу дошло, получается что ruslandh в самом первом сообщении темы спрашивает, можно ли получить кусок памяти из работающего чужого приложения? Нет, конечно - сразу схлопочем memory access violation. Когда я говорил, что можно получить кусок с данными чужой программы через malloc, я имел в виду, что мы получаем мусор, уже отработанную кем-то память, помеченную в системных ресурсах как свободную для использования, но не зачищенную (ибо зачем?) при предоставлении нашей задаче. Это и только это я имел в виду. О таблицах дескрипторов речи нет. Или там о зачистке памяти из BSS-секции... :]

mar 04-08-2005 23:55 346011

hasherfrog
до меня тоже только сейчас дошло: действительно, если задача такая, что ее данные не стоит никому показывать, даже кусками после отработки, то надо, видимо, не просто "уничтожать" выделенную область, но предварительно чистить, заполняя все куски памяти чем-нибудь однородным.

ruslandh 24-08-2005 19:13 350476

Интересно, то, что "погоняв" эту программульку, я, насколько мог убедился, что при первом выделении памяти через malloc - память всегда нулевая, а потом можно видеть свой "муссор" (если-бы это был кусочек вируса, то да :) ) , также память нулевая, если запрашивается больше определённого размера K.

Zur0 12-09-2005 13:13 354908

а можно вообще всю память посмотреть в /dev/mem... тока прова рута нужны %)


Время: 04:36.

Время: 04:36.
© OSzone.net 2001-