URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8974
[ Назад ]

Исходное сообщение
"malloc"

Отправлено сайлон , 22-Дек-10 10:21 
int main (int argc, char *argv[])
  {
   char *test;
   test = (char *) malloc(0 * sizeof(char));
   memset( test, 0, 10 );

   if ( test == NULL ) { printf("Error \n"); }

   char flag[500];
   memset(flag,0,500);

   strcpy(flag,"abcdifghlkopm1234567890abcdifghlkopm1234567890abcdifghlkopm1234567890");

   strcpy(test,flag);

   printf("%s\n", test);

   free(test);
  
   return 0;
  }

Вот такой пример не догоняю почему не сегфолтится ведь маллок не выделил достаточное кол-во памяти ?


Содержание

Сообщения в этом обсуждении
"malloc"
Отправлено phpcoder , 22-Дек-10 10:46 
> Вот такой пример не догоняю почему не сегфолтится ведь маллок не выделил
> достаточное кол-во памяти ?

У меня падает:

*** glibc detected *** ./hello: free(): invalid next size (fast): 0x09840008 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb77d3704]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb77d56b6]
./hello[0x804860f]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb777a775]
./hello[0x8048491]
======= Memory map: ========


"malloc"
Отправлено phpcoder , 22-Дек-10 10:47 
P.S. Ubuntu 9.04



"malloc"
Отправлено guest , 22-Дек-10 11:17 
> Вот такой пример не догоняю почему не сегфолтится ведь маллок не выделил
> достаточное кол-во памяти ?

Это все библия (posix) виновата)Поведение для malloc(0) не определено.

Например glibc выделит блок минимально возможного размера (обычно 16байт для 32битных систем и 32байта для 64битных).
freebsd в зависимости от настроек вернет ошибку или 1 блок размером 1 байт и тут уж если повезет, то упадет сразу на memset(), иначе глюки.
netbsd возвращает некий минимальный блок.
openbsd считает malloc(0) жутким багом и возвращает валидный указатель на защищенную область памяти, т.е. любая попытка записи/чтения ведет к сегфолту, но free() сделать можно.


"malloc"
Отправлено сайлон , 22-Дек-10 12:10 
>[оверквотинг удален]
> Это все библия (posix) виновата)Поведение для malloc(0) не определено.
> Например glibc выделит блок минимально возможного размера (обычно 16байт для 32битных систем
> и 32байта для 64битных).
> freebsd в зависимости от настроек вернет ошибку или 1 блок размером 1
> байт и тут уж если повезет, то упадет сразу на memset(),
> иначе глюки.
> netbsd возвращает некий минимальный блок.
> openbsd считает malloc(0) жутким багом и возвращает валидный указатель на защищенную область
> памяти, т.е. любая попытка записи/чтения ведет к сегфолту, но free() сделать
> можно.

Понятно!

Последний вопрос по поводу маллока , вот я написал некий сервис, который на каждый чих
выделяет память без разбору, от 10 байт до 10000, все работает прекрасно, но бытует мнение ,что выделять часто маленькие фрагменты памяти есть неправильно!!!
Чем это черевато, тем что память рано или позно не сможет быть выданна или просто возрастет время выдиления этой памяти из кучи.


"malloc"
Отправлено guest , 22-Дек-10 12:30 
> выделяет память без разбору, от 10 байт до 10000, все работает прекрасно,

Если работает действительно прекрасно, то зачем что-то трогать)))

> Чем это черевато, тем что память рано или позно не сможет быть
> выданна или просто возрастет время выдиления этой памяти из кучи.

в боевых условиях я видел только 2й вариант, а 1й только на синтетических тестах.

Например я в похожей задаче использовал alloca(3) (да, знаю черевато, но быстро и дешево), и чутка подпиленные под свои реалии апачевские apr_pool_*().


"malloc"
Отправлено сайлон , 22-Дек-10 12:38 
>> выделяет память без разбору, от 10 байт до 10000, все работает прекрасно,
> Если работает действительно прекрасно, то зачем что-то трогать)))
>> Чем это черевато, тем что память рано или позно не сможет быть
>> выданна или просто возрастет время выдиления этой памяти из кучи.
> в боевых условиях я видел только 2й вариант, а 1й только на
> синтетических тестах.
> Например я в похожей задаче использовал alloca(3) (да, знаю черевато, но быстро
> и дешево), и чутка подпиленные под свои реалии апачевские apr_pool_*().

по поводу аллока я уже  проиграл ситуацию , слишком там уж много (НО) хотя согласен
заманчивый инструмент..


"malloc"
Отправлено guest , 22-Дек-10 12:49 
> по поводу аллока я уже  проиграл ситуацию , слишком там уж
> много (НО) хотя согласен
> заманчивый инструмент..

Ну да)
у меня был не большой уровень вложенности, известный размер стэка (хотя почти все платформы позволяют оверкомит через стек) и лок от рекурсий в опасных местах. Не падает)))
В любом случае для маленьких блоков похожий инструмент не сложно реализовать на sys/queue.h и одном malloc().


"malloc"
Отправлено Ilya Lihachev , 22-Дек-10 16:03 
>[оверквотинг удален]
>    char flag[500];
>    memset(flag,0,500);
>    strcpy(flag,"abcdifghlkopm1234567890abcdifghlkopm1234567890abcdifghlkopm1234567890");
>    strcpy(test,flag);
>    printf("%s\n", test);
>    free(test);
>    return 0;
>   }
> Вот такой пример не догоняю почему не сегфолтится ведь маллок не выделил
> достаточное кол-во памяти ?

If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item.