The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"malloc"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"malloc"  +/
Сообщение от сайлон on 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;
  }

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

Ответить | Правка | Cообщить модератору

Оглавление

  • malloc, phpcoder, 10:46 , 22-Дек-10, (1)  
    • malloc, phpcoder, 10:47 , 22-Дек-10, (2)  
  • malloc, guest, 11:17 , 22-Дек-10, (3)  
    • malloc, сайлон, 12:10 , 22-Дек-10, (4)  
      • malloc, guest, 12:30 , 22-Дек-10, (5)  
        • malloc, сайлон, 12:38 , 22-Дек-10, (6)  
          • malloc, guest, 12:49 , 22-Дек-10, (7)  
  • malloc, Ilya Lihachev, 16:03 , 22-Дек-10, (8)  

Сообщения по теме [Сортировка по времени | RSS]


1. "malloc"  +/
Сообщение от phpcoder email(ok) on 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: ========

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "malloc"  +/
Сообщение от phpcoder email(ok) on 22-Дек-10, 10:47 
P.S. Ubuntu 9.04


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "malloc"  +/
Сообщение от guest email(??) on 22-Дек-10, 11:17 
> Вот такой пример не догоняю почему не сегфолтится ведь маллок не выделил
> достаточное кол-во памяти ?

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

Понятно!

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "malloc"  +/
Сообщение от guest email(??) on 22-Дек-10, 12:30 
> выделяет память без разбору, от 10 байт до 10000, все работает прекрасно,

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

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

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

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "malloc"  +/
Сообщение от Ilya Lihachev email on 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.


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру