LINUX.ORG.RU

Переполнение кучи в glibc и другое

 ,


0

4

Рунет сегодня ожил, а тут свежачок подвезли:

https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=6bd0e4efcc78f3c0115e5ea9739a1642807450da;hp=8aeec0eb5a18f9614d18156f9d6092b3525b818c

И ещё другие баги в glibc 2.37 типа порчи памяти в qsort.

Если бегло взглянуть на код исправления по ссылке, ясно, что это не что-то совсем уж тривиальное, т.е. именно те случаи, ради которых выдумываются и продвигаются все эти ады и расты. Но так же понятно, что в существенное количество устройств такие баги даже не смогут теоретически попасть, потому что будут исправлены ещё до того, как конторы дойдут до версии glibc 2022г.в.

Перемещено hobbit из talks

★★★★★

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

В венде и лялексе, как минимум

Не, если синхронизационные примитивы не багаются то всё норм.

В C нет синхронизационных примитивов. Точнее, есть начиная с C11 (mtx_*), но настоящие сишники это конечно же не признают.

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

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

Потому что это сишники. У них «всё работает». Не ты ли мне про select() в другом треде топил при существовании wsapoll? Вот с такой логикой всё это говно и делается на ровном месте.

Хотя про то что своя реализация может багнуться я не знал.

У сишных быдлокодеров всё может багнуться. Херли нет-то?

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

Представь себе, например, проц с сотнями мелких ядер, у каждого из которых своя адресуемая память + доступ к общему банку.

Внезапно Parallax Propeller. Достаточно давно существующие забавные однокристалки с 8-ю 32-битными ядрами, которые серийно выпускались когда писюковый процессор с 2 ядрами всё ещё был новинкой. Из языков программирования для них есть только ассемблер, сишечка и, внезапно, бейсик, причём компилируемый. Есть ещё спин, но это была попытка сделать что-то подобное Arduino IDE когда про Arduino ещё особо никто не знал и в отличии от Ардуины заточенная под написание многопотокового софта и со своим синтаксисом.

Ни раста, ни даже эрланга для них нету. :) А сишечка есть. И писать на ней под 8 ядер пропеллера легко и просто.

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

толкает в программирование подходы ни к расту ни к программированию никакого отношения не имеющие.

Да нет, программирование «через жопу» было изобретено задолго до руста. Большая часть сишного кода вот ровно так и написана, на самом деле, и работает тоже так же.

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

Ни раста, ни даже эрланга для них нету. :) А сишечка есть. И писать на ней под 8 ядер пропеллера легко и просто.

Ты не понял. Большая часть существующего кода на Erlang без проблем на таком проце заведётся и будет работать даже достаточно резво. А вот существующий код на C проще выкинуть и написать с нуля.

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

Если бы сишки не было, как бы люборасты рекламировали свою секту? Какой язык обсирали бы?

На 100% уверен, что это был бы язык на котором была бы написана подавляющая часть популярного софта в мире. :)

Рассказывали бы тут какой глючный, неправильный форт, лисп или там паскаль какой.

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

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

На 100% уверен, что это был бы язык на котором была бы написана подавляющая часть популярного софта в мире. :)

JavaScript что ли? Потому что большая часть софта сейчас как раз на нём.

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

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

Стасон, найди мужика уже.

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

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

Стасон, найди мужика уже.

Трахни его сам!

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

Трахни его сам!

Он убогий!

Кто-то должен это сделать ради всего ЛОРа! Мы тебе у Макскома специальную звезду выбьем. Коричневую.

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

Большая часть существующего кода на Erlang без проблем на таком проце заведётся и будет работать даже достаточно резво.

Теоретически. Практически же - в пропеллер, даже второй, beam ну никак не лезет, a hipe, я так понял, умер ещё до появления пропеллеров.

Кстати, P8X32A Параллакс заопенсорсил. Полностью, включая железо.

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

Теоретически. Практически же - в пропеллер, даже второй, beam ну никак не лезет, a hipe, я так понял, умер ещё до появления пропеллеров.

Ваще пофиг. Написать виртуальную машину под новый проц проще чем переписывать вообще весь пользовательский код с нуля.

Но вообще, я имел ввиду не ебмеддед с его однокристаллками, а скорее аналог нынешних досктопных и серверных процов.

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

Внутри это alignas(L1_CACHE_BYTES). alignas – часть стандарта, если что.

Если мне ничего не изменяет, в ANSI C никакого alignas не было и появилось только в хипсторских С11 и плюсах.

Так прикладное или системное, лол?

Ну да, системное прикладное ПО. Например coreutils. Ядро линукс это отдельный зверь и там скорее язык программирования gcc используется, а не Си.

Ты сказал, что этим занимается не программист.

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

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

В C нет синхронизационных примитивов

Они есть в системных библиотеках, например libpthread и kernel32.dll. И как я тебя понял, они работают исправно, а больше ничего и не нужно.

в принципе любой сишный код проще гораздо прибить к одному процессору

Прибивание не только к процессору но и к конкретному ядру вполне полезно с точки зрения работы кеша. Не знаю почему в планировщиках по дефолту такого (пусть и не строгого) нет и они один тред размазывают поровну на все ядра даже если он влезает на одно. А какие ещё могут быть проблемы?

Не ты ли мне про select() в другом треде топил при существовании wsapoll? Вот с такой логикой всё это говно и делается на ровном месте.

Это плохая аналогия. Вот если бы я агитировал делать неблокирующий read()/write() по всем сокетам в цикле, говоря это это моя юзерспейсная реализация селекта, то да. А так select это такое же стандартное апи от ОС.

У сишных быдлокодеров всё может багнуться. Херли нет-то?

Тогда не понял. Это был обычный наезд что «все сишники багоделы», или там реально проблема? Ну мютекс без сисколлов ты никак не сделаешь, процесс надо в слип уводить пока он ждёт. А вот спинлок вполне можно, например через атомик, или через volatile переменную с memory барьером - вот эти реализации будут багаться в numa или нет?

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

Если речь про структуры, то компилятор выровнит всё по заданным правилам, самодеятельности там никакой не будет. Оптимизатор вообще ни при чём. Разве что локальные переменный функций может в стеке (те что не в регистрах) разместить в оптимальном порядке.

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

Не ты ли мне про select() в другом треде топил при существовании wsapoll? Вот с такой логикой всё это говно и делается на ровном месте.

Это плохая аналогия. Вот если бы я агитировал делать неблокирующий read()/write() по всем сокетам в цикле, говоря это это моя юзерспейсная реализация селекта, то да. А так select это такое же стандартное апи от ОС.

Это отличная аналогия! Неблокирующий read/write – это просто следующий шаг на пути в полное безумие, там в треде такое вроде тоже предлагали :DDDDD

Это был обычный наезд что «все сишники багоделы», или там реально проблема? Ну мютекс без сисколлов ты никак не сделаешь, процесс надо в слип уводить пока он ждёт.

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

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от untitl3d

Извини, но совершенно неуместный пример. Мы тут про alignment, а не про кеш мисы вроде.

Про выравнивание тебе членов за воротник насовали выше, его тоже руками надо делать очень часто. Кекеке!

Но я писал и про выравнивание, и про кеши. Одновременно. Эти вещи оооой как связаны.

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

Они имеют одинаковую производительность.

time ./b.out

real    0m3,934s
user    0m3,934s
sys     0m0,000s
 time ./a.out

real    0m3,935s
user    0m3,935s
sys     0m0,001s

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

какое выравнивание, товарищ? Сейчас не 1985-й год. Не знал этого? Теперь, знай! Нет никакого выравнивания, давно. Все данные в кеше выровнены, ты задолбаешься исхитряться запихнуть туда невыровненные данные. Это надо специально и очень изощрённо вредить, чтобы в кеше оказались невыровненные данные.

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

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

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

Ну мы не про такой софт, правда?

И про такой тоже. У меня по крайней мере больше всего «якобы UB» операций с указателями именно в таком было, и разумеется всё работало, а добросовестность компилятора можно потом дизассемблером проверить.

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

какое выравнивание, товарищ? Сейчас не 1985-й год. Не знал этого? Теперь, знай!

То-то ядро усыпано декларациями этого самого выравнивания. Смотри выше.

Это надо специально и очень изощрённо вредить, чтобы в кеше оказались невыровненные данные.

Вот именно. Невыравненные данные в кеше могут не оказаться, в этом вся проблема.

Они имеют одинаковую производительность.

Круто. А теперь собери с оптимизациями.

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

То-то ядро усыпано декларациями этого самого выравнивания. Смотри выше.

Товарищ, это артифакты. Следы всех этих альф, спарков. Их никто не вычистил.

Круто. А теперь собери с оптимизациями.

Это собрано с оптимизациями. Я - делал, ты - не делал. И ты споришь со мной.

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

То-то ядро усыпано декларациями этого самого выравнивания. Смотри выше.

Товарищ, это артифакты. Следы всех этих альф, спарков. Их никто не вычистил.

Да нет, это просто суровая реальность.

Круто. А теперь собери с оптимизациями.

Это собрано с оптимизациями. Я - делал, ты - не делал. И ты споришь со мной.

Нуок, сделай размеры массивов побольше. А то стопудов у тебя в кеш всё попало и потому разницы нет.

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

Если мне ничего не изменяет, в ANSI C

Всем насрать что там было в ANSI C. Двадцать пять лет прошло.

Ну да, системное прикладное ПО. Например coreutils.

Лол.

там скорее язык программирования gcc используется, а не Си

Он от C11 отличается примерно ничем.

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

Ага, уверен.

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

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

Не, не используется. В любом месте кроме ядра уместно пользоваться арифметикой указателей. Если ты этого не делаешь – в 99.999% ты сам себе стреляешь в ногу. Ну или тому, кто этот код будет использовать.

cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 1)
Ответ на: комментарий от BceM_IIpuBeT

Приседания препроцессора, компилятора и линкера не меняют сути.

Суть простая – указатель не число. Остальное – разной степени везения нарушения абстракции.

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

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

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

на которым валидны операции чтения/записи

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

firkax ★★★★★
()