LINUX.ORG.RU
ФорумTalks

2 дня на это

 ,


1

2

(нехочу засорять девелоп ветку форума)

у меня просто мозг взорвался уже
два дня я по 60000 строкам кода ищу откуда у меня течет память, часть кода скопипащена из другого проекта где 100% нет никаких утечек
таки выяснил

char *http_length ="";
sprintf(http_length,"test %i\r\n", strlen("test\n"));
printf(http_length);

ктото мне может объяснить как этот код может Не давать утечек памяти
я уже раз 50 пересобрал «исходный проект» где нет утечек с этим кодом, и в упор понять не могу
КАК это возможно, почему в моем коде это течет, а там нет, вот нет я в цикле это 500000 раз запускал тыкал в разные куски кода в «исходном проекте» и делаю тоже самое у меня-там не течет, у меня течет
Помогите спасите

Эмм, но ты же переписываешь некую рандомную область памяти(область глобальных переменных), которая по счастливому стечению обстоятельств ещё и доступна для записи. Видимо другой код, хранит в той памяти какую то ссылку на ресурс связанный с памятью.

pon4ik ★★★★★
()

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

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

стековую??? иди учи матчасть

На всякий случай проверил, вот смотри, тебе говорит это о чём то вообще?

   0x000000000040052e <+8>:	movq   $0x4005d4,-0x8(%rbp)
А точно, в стек отправляется только адрес переменной.

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

чтобы это была стековая память, пришлось бы туда копировать эту строку. Для всего что не является локальными переменными - всех констант, на которые нужны указатели, всех глобальных и статических объектов используется статическая область.
Есть пример наглядно показывающий расположение классов хранения:
https://ideone.com/aiUlVO

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

вот такой код не будет(будет но с утечками/крашами) работать, как у тебя

char *http_length = malloc(256);

верно так

char *http_length = (char*)malloc(256*sizeof(char));

аналогично с realloc

testersup889
() автор топика
Ответ на: комментарий от next_time

в оригинальном С нет такого ключевого слова

Угу, не обратил внимания на тег «с».

тем не менее, вылететь почти обязан: sizeof(http_length) == 1

http_length - это указатель на char. Следовательно sizeof(http_length) == sizeof(void*).

приведётся без малейших проблем

Не приведется, а снимется со стека sizeof(signed int) бит.
Следовательно на 64х битной системе следующий параметр (будь он в строке форматирования) будет снят неверный.

andreyu ★★★★★
()
Ответ на: комментарий от i-rinat

там еще такая строка неверная

http_length[0] = '/0';

надо так

((char*)http_length)[0] = '/0';

ибо

array[0]
|       array[1]
|       |
1 2 3 4 5 6 7 8 9 10 11
| |
| ((char *)array)[1]
((char *)array)[0]

testersup889
() автор топика
Ответ на: комментарий от testersup889

Это уже не смешно, это какой-то тупняк.

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

i-rinat ★★★★★
()
Ответ на: комментарий от testersup889

sizeof(char)

Либо это такой интересный компилятор, либо это какое-то странное извращение.

Deleted
()

нехочу засорять девелоп ветку форума

Как это засорять, там же и так помойка

TheAnonymous ★★★★★
()

В голове не укладывается, что люди, пишущие такой говнокод, получают за это деньги. Ведь даже мне, учившему си по книжками и написавшему пару helloworld'ов, понятно, что это просто супер нубские ошибки. Остаётся только надеяться, что мне никогда не придётся работать с «проектом» этих авторов.

flyshoot
()
Ответ на: комментарий от testersup889

Что за арифметика с указателем на void? Это какой компилятор и какой стандарт так умеют?

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

Остаётся только надеяться, что мне никогда не придётся работать с «проектом» этих авторов.

Пол Ынтерпрайза состоит из таких разработчиков. Посмотрите на windows, flash, ios,...

andreyu ★★★★★
()

Ловко ты память запиливаешь! Утечек у тебя тут и не будет. Просто стек похеришь и всё. не стек конечно, а сегмент данных.

sergej ★★★★★
()
Последнее исправление: sergej (всего исправлений: 2)
Ответ на: комментарий от testersup889

Хороший у тебя компилятор, сложно поверить, что порт «порт gcc (свежего) на Не x86 архитектуру(свои команды процессора и менеджмент памяти свой)» не умеет выполнять автоматическое приведение и преобразование типов.

А чему равен sizeof(char) у тебя? И что за архитектура компьютера или контроллера?

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

В Linux же указали максимальный размер пути 256)

Не в linux а на fs, не путайте.

Я вот только не знаю, сейчас то можно использовать больше 256 байт или нет?

Ну если использовать ntfs то почему нет? И еще емнип для xfs патч был.

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

При попытке его освободить он скорее упадёт. Если не освобождает, значит утечка и без этого будет. Хотя чёрт его знает. Запилы непредсказуемы.

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

Пол Ынтерпрайза состоит из таких разработчиков. Посмотрите на windows, flash, ios,...

Такое возможно только в небольших проектах. В чём-то крупном, как тот же Flash, из-за подобных багов всё просто перестанет работать вообще.

Попробуй поищи вот тут https://github.com/adobe/avmplus подобный код.

i-rinat ★★★★★
()
Ответ на: комментарий от testersup889

256*sizeof(char)

sizeof(char) по стандарту равен 1 (даже если там не 1 байт), можно не умножать.

bormant ★★★★★
()

Ты зелёный и толстый.

Xellos ★★★★★
()
Ответ на: комментарий от i-rinat

Такое возможно только в небольших проектах.

Такое возможно в любых проектах. Вообще в любых. И чем проект больше, тем выше вероятность появления в нем косяка.

В чём-то крупном, как тот же Flash, из-за подобных багов всё просто перестанет работать вообще.

История показывает, что так оно и есть - куча багов была найдена во флеше. И неизвестно сколько их там еще осталось.
Виндовс 10 показателен качества кода.

andreyu ★★★★★
()
Ответ на: комментарий от cvs-255

а тут пишут мимо

Где-то, уже не помню, я встречал такой авторский термин - удар по памяти. Он же банальное переполнение или «пишу ХЗ куда».

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

И чем проект больше, тем выше вероятность появления в нем косяка.

Вот именно для поиска таких ошибок и делают статический анализ всякими Coverity и прочими PVS.

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

Вот именно для поиска таких ошибок и делают статический анализ всякими Coverity и прочими PVS

Кто же с этим спорит?

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

Ну, как правило, серьёзный Ынтерпрайз статанализ юзают в режиме нонстоп. Впрочем, некоторые (даже серьёзные, казалось бы, люди) думают, что «нинужно» и тесты решают всё (решают, но не всё).

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

И чем проект больше, тем выше вероятность появления в нем косяка.

Да, в этом-то всё и дело. Подробности ниже.

История показывает, что так оно и есть - куча багов была найдена во флеше.

Что, прям вот такие: char *a = ""; sprintf(a, "hello");? Если бы там были ТАКИЕ баги, других бы не находили. Просто потому что плагин просто никто не мог бы запустить.

Там баги были хитрые. В основном из-за того, что код пытались сделать быстрее JIT-компилятором. Где-то в генераторе кода не учли краевые условия — вот уже баг с выполнением кода.

Виндовс 10 показателен качества кода.

Они разве показывали исходники своих внутренностей?

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

Что, прям вот такие:

ну memmove() и memcpy() адоб путали.

legolegs ★★★★★
()
Ответ на: комментарий от i-rinat

Что, прям вот такие: char *a = ""; sprintf(a, «hello»);?

Таких возможно и не было. Это не отменяет факт глюкавости и дырявости флеша.

Они разве показывали исходники своих внутренностей?

Я должен съесть дерьмо, что бы рассуждать о его вкусе?

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

Это не отменяет факт

Видимо, мне не получится тебе объяснить. То ли я не могу объяснять, то ли ты не способен понять. Ещё одну попытку сделаю, может получится.

Итак. Во-первых, в любом софте бывают ошибки. Чем больше софт, тем плотность ошибок больше. То есть, число ошибок не зависит от объёма исходников линейно. Из того факта, что кто-то в одного сделал небольшую программку, в которой нет ошибок, не означает, что он же не накосячит в большой программе, даже если все участники будут с его же уровнем квалификации. Во-вторых, чтобы ты мог заявлять о глюкавости и дырявости продукта F от компании A, этот продукт должен быть широко распростанён. То есть, его должны юзать как разработчики, так и пользователи в большом количестве. А это будет невозможно, если он будет каждую секунду-две падать, причём вместе с браузером. Пользователи его просто отключат и больше никогда не включат. Стало быть, заявления о том, что продукт F глюкав и дыряв уже говорят о том, что его качество вообще-то на достаточно хорошем уровне. Конечно, это не значит, что его не нужно делать лучше. Проблема в том, что это становится очень трудно.

Я должен съесть дерьмо, что бы рассуждать о его вкусе?

Вообще-то, должен. Как ты иначе сможешь узнать его вкус?

О сортах можно рассуждать не пробуя. Но ты написал про вкус.

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

Итак. Во-первых, в любом софте бывают ошибки. Чем больше софт, тем плотность ошибок больше.

Факт, о котором я сказал выше.

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

Тоже факт.

Во-вторых, чтобы ты мог заявлять о глюкавости и дырявости продукта F от компании A, этот продукт должен быть широко распростанён.

Я упомянул windows, flash, ios. На мой взгляд, они достаточно широко распространены.

Стало быть, заявления о том, что продукт F глюкав и дыряв уже говорят о том, что его качество вообще-то на достаточно хорошем уровне.

В таком случае уровень такого качества приближается к уровню плинтуса в глубоком колодце.

Вообще-то, должен. Как ты иначе сможешь узнать его вкус?

У него вкус говна. Зачем его для этого пробовать?

О сортах можно рассуждать не пробуя. Но ты написал про вкус.

Можно только рассуждать о количестве сортов.

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

В таком случае уровень такого качества приближается к уровню плинтуса в глубоком колодце.

В этом подразумевается сравнение с уровнем земли? Какой тогда аналог в софте?

У него вкус говна. Зачем его для этого пробовать?

И где рассуждения? Ты писал про рассуждения.

Можно только рассуждать о количестве сортов.

Можно плотность измерить, вязкость, температуру замерзания, теплоёмкость. В общем, много чего. Цвет, например. Или спектр поглощения. Как и для кучи других веществ. А у тебя фиксация на говне какая-то.

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

В этом подразумевается сравнение с уровнем земли?

Да, это ниже уровня земли.

Какой тогда аналог в софте?

Аналог чего? Весь мой поинт был в том, что такие разработчики («Остаётся только надеяться, что мне никогда не придётся работать с «проектом» этих авторов.») есть не только на ЛОРе, но и в больших серьезных компаниях. Как пример я привел очень большие проекты.
Кстати, весьма показателен был бы пример огромного старинного проекта tivoli от ibm. Внутри там ад и израиль. И двойное освобождение памяти еще не самая страшная бага в этом софте.

andreyu ★★★★★
()
Ответ на: комментарий от i-rinat

И где рассуждения? Ты писал про рассуждения.

Я привел аналогию. Что мне не обязательно видеть исходники виндовс, что бы воочию наблюдать ее глюкавость.

А у тебя фиксация на говне какая-то.

Так оно вокруг нас. И вообще, как говорил А. Кулинкович, «люди - это машины по производству говна».

andreyu ★★★★★
()

напиши так

char http_length[2048];

вместо

char *http_length ="";

и не будет переполнения буферов. И не надо никаких малоков.

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