LINUX.ORG.RU

[Си] double free or corruption

 


0

0
#include <string.h>
#include <stdlib.h>


int main()
{
	char **test;
	
	test = malloc(4);
	int i;
	
	for(i=0; i<4; i++)
	{
		test[i] = malloc(5);
		strcpy(test[i], "test");
	}
	
	for(i=0; i<4; i++)
	{
		free(test[i]);
	}
	
	free(test);
	
	return 0;
}

Компилю gcc, запускаю. В ответ:

*** glibc detected *** ./a.out: double free or corruption (out): 0x0000000001575030 ***

и дамп памяти далее.

В чем собственно дело?

★★★
Ответ на: комментарий от ttnl

> DX - регистр общего назначения, причем половина регистра.

> … причем половина регистра.

> … половина регистра.

а куда делась его вторая половина? ;)

arsi ★★★★★
()
Ответ на: комментарий от lester

>Ты видел в ядре вещественную арифметику??

скоро тебя начнут растаскивать на цитаты


Хорошо, сейчас для самых недалеких, но очень амбициозных товарищей
типа тебя, я специально найду пруфлинк на книгу Роберта Лава или
Бовета-Чезатти, где это написано.

А ты пока можешь попробовать добавить переменную float a в любую
компилирующуюся функцию ядра и попробовать его собрать. На x86

ttnl ★★★★★
()
Ответ на: комментарий от arsi

>а куда делась его вторая половина? ;)

Просрали все полимеры :)

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

> Линукса Торвальдса

ты неподражаем

lester ★★★★
()
Ответ на: комментарий от ttnl

> А ты пока можешь попробовать добавить переменную float a в любую компилирующуюся функцию ядра и попробовать его собрать. На x86

x86 поддерживает IEEE 754 32-бит нативно.

arsi ★★★★★
()
Ответ на: комментарий от ttnl

фцитатник!!!

> В ядре Линукса Торвальдса

you made my night ;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

>x86 поддерживает IEEE 754 32-бит нативно.

Оно может многое поддерживать, не пихать же все в ядро. Функция
переключения процессов. Обращаю внимание, в каких случаях восстанавливается fpu

http://lxr.linux.no/#linux+v2.6.33/arch/x86/kernel/process_32.c#L305

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

> Хорошо, сейчас для самых недалеких, но очень амбициозных товарищей
типа тебя

какая точная характеристика :) только ты перепутал последнее слово, ну да ладно

А ты пока можешь попробовать добавить переменную float a в любую

компилирующуюся функцию ядра и попробовать его собрать. На x86

ты уже свои шаловливые руки в ядро запускал? и даже не осилил базовые вещи?

lester ★★★★
()
Ответ на: комментарий от lester

>> Ты видел в ядре вещественную арифметику??

скоро тебя начнут растаскивать на цитаты



Почитай книжку вот эту книжку http://log-in.ru/books/21143/

42 страница

Она написано довольно популярно, но все же из нее можно извлечь,
что в ядре можно, а что нельзя. А то не знаешь даже элементарных
вещей

ttnl ★★★★★
()
Ответ на: комментарий от lester

>> Хорошо, сейчас для самых недалеких, но очень амбициозных товарищей
типа тебя

какая точная характеристика :) только ты перепутал последнее слово, ну да ладно


А теперь моя очередь задавать вопросы.

Первый вопрос. Каким образом происходит считывание данных из конфигурационного
пространства PCI устройства? Какие выполняются команды? Подробность
на уровне разыменовывания виртуальных адресов.

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

> Обращаю внимание, в каких случаях восстанавливается fpu

по сцылке не ходил, за ненадобностью. но как системный программист embedded-систем могу ответить сходу: есть две стратегии переключения контекста сопроцессора, в зависимости от задач: либо при переключении контекста задачи (если 40+% времени задачи используют сопроцессор), либо по исключению «устройство не найдено», когда при переключении задачи сбрасывается флаг наличия сопроцессора, а при исключении осуществляется собственно само переключение (эффективно при слабом использовании сопроцессора).

arsi ★★★★★
()
Ответ на: комментарий от ttnl

> Почитай книжку вот эту книжку

книжка такая книжка :) именно потому-что она написана популярно ты тут и позоришься, не поленись поискать тот же float в исходниках - потом подумай хорошо

lester ★★★★
()
Ответ на: комментарий от ttnl

Каким образом происходит считывание данных из конфигурационного

пространства PCI устройства? Какие выполняются команды? Подробность на уровне разыменовывания виртуальных адресов.

давай я тебя пошлю читать мануалы, просто пошлю

lester ★★★★
()
Ответ на: комментарий от arsi

>по сцылке не ходил, за ненадобностью. но как системный программист embedded-систем могу ответить сходу

Фишка в том, что ядру в вещественной арифметики надобности нет.
Оно не вычисляет сверхточных данных. Единственное, пожалуй, время,
но оно хранится в качестве структуры.

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

> Фишка в том, что ядру в вещественной арифметики надобности нет.

а ты таки забавный :) ты перед тем как голословные утверждения делать - поищи double + float в ядре, ты будет очень удивлен как часто эта самая «вещественная арифметика» там используется

lester ★★★★
()
Ответ на: комментарий от ttnl

> Фишка в том, что ядру в вещественной арифметики надобности нет.

фишка в том, что цитируемое предложение не противоречит тому, что я сказал. тебе захотелось с собой поспорить, а мы тебе мешаем? ;)

arsi ★★★★★
()
Ответ на: комментарий от lester

>как часто эта самая «вещественная арифметика» там используется

Давай пруф для x86. Попробуй скомпилировать такой драйвер для x86.
Не ссы, это не опасно. Ну давай!

ttnl ★★★★★
()
Ответ на: комментарий от arsi

>фишка в том, что цитируемое предложение не противоречит тому, что я

сказал. тебе захотелось с собой поспорить, а мы тебе мешаем? ;)


Ты подверг сомнению моё исходное сообщение о float, я тебе ответил.
Если ты такой крутой разработчик, то почему споришь по очевидным вещам?
Хотя мозгов у тебя похоже побольше, чем у лестера.

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

может тебе еще в рот положить и разжевать? сам ищи - не маленький, заодно почитай про IEEE-754 ;)

lester ★★★★
()
Ответ на: комментарий от lester

>а я на слабо от всякого ламерья не ведусь :Р

Конечно, ты не ламер. Ты освоил ассемблер до необходимого тебе уровня,
вершиной знания которого является знание отличие регистра edx от ds.
Респект тебе и уважуха!

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

>А ты пока можешь попробовать добавить переменную float a в любую
компилирующуюся функцию ядра и попробовать его собрать. На x86

И что с ним будет? В книжке, ссылку на которую ты дал, написано, что вычисления с плавающей точкой могут не поддерживаться процессором, поэтому их не стоит использовать в ядре. А что в случае с современным x86?

Dimanc ★★
()
Ответ на: комментарий от Dimanc

>А что в случае с современным x86?

Слишком дорого обходится восстановление контекста при переключении задач.
99.9% потоков ядра, обработчиков и проч в вещественной арифметике не нуждаются.

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

> Респект тебе и уважуха!

я тебе открою еще один секрет - только никому-никому! не обязательно лезть в ядро и пытаться там что-то изменить, чтоб стать программистом

lester ★★★★
()
Ответ на: комментарий от ttnl

> Ты подверг сомнению моё исходное сообщение о float, я тебе ответил.

какое? о запрете на fp в ядре? см. выше.

> Если ты такой крутой разработчик, то почему споришь по очевидным вещам?

по очевидным вещам я не спорю ;)

> Хотя мозгов у тебя похоже побольше, чем у лестера.

зря подлизываешься, зарегистрированный анонимус ;)

arsi ★★★★★
()
Ответ на: комментарий от ttnl

> 99.9% потоков ядра, обработчиков и проч в вещественной арифметике не нуждаются.

а вот при обработке звука, например, назло всем требуется этот плохой-плохой float - и ничего, как ни странно работает вроде ;)

lester ★★★★
()
Ответ на: комментарий от ttnl

>Слишком дорого обходится восстановление контекста при переключении задач.

Хорошо. А при чем тут вещественная арифметика для современного x86 в ядре Linux?

Dimanc ★★
()
Ответ на: комментарий от arsi

>> Давай пруф для x86.

$ grep float -R /usr/src/linux/arch/x86 | wc -l

46


$ grep double -R /usr/src/linux/arch/x86 | wc -l


65



Ну а теперь посмотри, где оно используется.

ttnl ★★★★★
()
Ответ на: комментарий от arsi

>какое? о запрете на fp в ядре? см. выше.

Выше было следующее:

В смысле? Ты видел в ядре вещественную арифметику??


в ядре чего? :))) 80486+? vmlinuz? ntkernel.dll? )))


Я тебе ответил. Что непонятно? Какие-нибудь ещё вопросы?

ttnl ★★★★★
()
Ответ на: комментарий от Dimanc

>Хорошо. А при чем тут вещественная арифметика для современного x86 в ядре Linux?

Изначальный вопрос ко мне был о ней. Вопрос не от тебя.

ttnl ★★★★★
()
Ответ на: комментарий от arsi

>> Хотя мозгов у тебя похоже побольше, чем у лестера.

зря подлизываешься, зарегистрированный анонимус ;


Ты мне не нужен, неуловимый Джо.

Если такой крутой, ответь на мой первый вопрос. Посмотрим, «что это за товарищ Сухов».

ttnl ★★★★★
()
Ответ на: комментарий от lester

>а вот при обработке звука, например, назло всем требуется этот плохой-

лохой float - и ничего, как ни странно работает вроде ;)


Зачем ты все время ставишь смайлики? Ты что гомосексуалист? Прекрати их ставить,
пожалуйста.

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

alsa использует вещественную арифметику. dri. мало?

и да, при чём тут разрядность шины, регистров и т.п.? или не мужик слить по-честному? ;)

arsi ★★★★★
()
Ответ на: комментарий от ttnl

> Зачем ты все время ставишь смайлики?

мне один анонимус сказал, что с ними веселей - на%бал видимо

Ты что гомосексуалист?


нет

Прекрати их ставить, пожалуйста.


ну как тут не откликнуться на вежливую просьбу

lester ★★★★
()
Ответ на: комментарий от arsi

>alsa использует вещественную арифметику. dri. мало?

Боюсь, ты не понимаешь разницы между Ring 0 и user-space.
В пользовательском пространстве все что угодно непривилегированное
можно использовать. Собственно есть две части драйвера -
пользовательская и ядерная. Во всех иксовых дровах так. В alsa
также должно быть сделано.

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

вобщем давай читай про IEEE 754, смотри код и может поймешь как в той же alsa все сделано, спокойной ночи всем

lester ★★★★
()
Ответ на: комментарий от arsi

>дрова альсы и dri в линуксе в ринг-0

Возможно, но это не отменяет смысл мной сказанного.


В целом.

Такой толстый троллинг в Development с твоей стороны - очень непрофессионально.

Я даже ни разу не вышел из себя. Могли бы вдвоем с лестером что-нибудь
и поумнее придумать.

ttnl ★★★★★
()
Ответ на: комментарий от lester

>вобщем давай читай про IEEE 754, смотри код и может поймешь как в той

же alsa все сделано, спокойной ночи всем


Ага, иди высыпайся перед школой.

ttnl ★★★★★
()
Ответ на: комментарий от Dimanc

Ядро собирается с -msoft-float со всеми вытекающими.

Reset ★★★★★
()
Ответ на: комментарий от anonymous

> Стандарте языка Си не знает про такую функцию.

POSIX «знает», ну и реализована она практически везде

lester ★★★★
()
Ответ на: комментарий от vaulter

> Кстати, вопрос ко всем, почему не упало с Segmentation Fault?

Segmentation Fault вывалится, если память по адресу test+i не доступна для записи. А узнать есть реально память или нет по этому адресу можно только изучив алгоритм выделения памяти функцией malloc().

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.