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;
}Вот такой пример не догоняю почему не сегфолтится ведь маллок не выделил достаточное кол-во памяти ?
> Вот такой пример не догоняю почему не сегфолтится ведь маллок не выделил
> достаточное кол-во памяти ?У меня падает:
*** 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: ========
P.S. Ubuntu 9.04
> Вот такой пример не догоняю почему не сегфолтится ведь маллок не выделил
> достаточное кол-во памяти ?Это все библия (posix) виновата)Поведение для malloc(0) не определено.
Например glibc выделит блок минимально возможного размера (обычно 16байт для 32битных систем и 32байта для 64битных).
freebsd в зависимости от настроек вернет ошибку или 1 блок размером 1 байт и тут уж если повезет, то упадет сразу на memset(), иначе глюки.
netbsd возвращает некий минимальный блок.
openbsd считает malloc(0) жутким багом и возвращает валидный указатель на защищенную область памяти, т.е. любая попытка записи/чтения ведет к сегфолту, но free() сделать можно.
>[оверквотинг удален]
> Это все библия (posix) виновата)Поведение для malloc(0) не определено.
> Например glibc выделит блок минимально возможного размера (обычно 16байт для 32битных систем
> и 32байта для 64битных).
> freebsd в зависимости от настроек вернет ошибку или 1 блок размером 1
> байт и тут уж если повезет, то упадет сразу на memset(),
> иначе глюки.
> netbsd возвращает некий минимальный блок.
> openbsd считает malloc(0) жутким багом и возвращает валидный указатель на защищенную область
> памяти, т.е. любая попытка записи/чтения ведет к сегфолту, но free() сделать
> можно.Понятно!
Последний вопрос по поводу маллока , вот я написал некий сервис, который на каждый чих
выделяет память без разбору, от 10 байт до 10000, все работает прекрасно, но бытует мнение ,что выделять часто маленькие фрагменты памяти есть неправильно!!!
Чем это черевато, тем что память рано или позно не сможет быть выданна или просто возрастет время выдиления этой памяти из кучи.
> выделяет память без разбору, от 10 байт до 10000, все работает прекрасно,Если работает действительно прекрасно, то зачем что-то трогать)))
> Чем это черевато, тем что память рано или позно не сможет быть
> выданна или просто возрастет время выдиления этой памяти из кучи.в боевых условиях я видел только 2й вариант, а 1й только на синтетических тестах.
Например я в похожей задаче использовал alloca(3) (да, знаю черевато, но быстро и дешево), и чутка подпиленные под свои реалии апачевские apr_pool_*().
>> выделяет память без разбору, от 10 байт до 10000, все работает прекрасно,
> Если работает действительно прекрасно, то зачем что-то трогать)))
>> Чем это черевато, тем что память рано или позно не сможет быть
>> выданна или просто возрастет время выдиления этой памяти из кучи.
> в боевых условиях я видел только 2й вариант, а 1й только на
> синтетических тестах.
> Например я в похожей задаче использовал alloca(3) (да, знаю черевато, но быстро
> и дешево), и чутка подпиленные под свои реалии апачевские apr_pool_*().по поводу аллока я уже проиграл ситуацию , слишком там уж много (НО) хотя согласен
заманчивый инструмент..
> по поводу аллока я уже проиграл ситуацию , слишком там уж
> много (НО) хотя согласен
> заманчивый инструмент..Ну да)
у меня был не большой уровень вложенности, известный размер стэка (хотя почти все платформы позволяют оверкомит через стек) и лок от рекурсий в опасных местах. Не падает)))
В любом случае для маленьких блоков похожий инструмент не сложно реализовать на sys/queue.h и одном malloc().
>[оверквотинг удален]
> 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.