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

★★★★★

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

Я придумал. Процессоры — говно, сишка невиновата!

Да нет, ты просто дебил. Кстати, указатели и правда не числа. Попробуй указатель на указатель умножить в C, например.

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

И получим сегфолт.

Бгг. А мужики-то не знают! Интересно, откуда в куче разных архитектур после ресета в первой странице берётся таблица адресов прерываний? Её туда Пушкин из астрала размещает?

Таблицу прерываний именно так и создают вообще-то. Буквально *(void (**)())0x0000004 = int1_handler; Можно и побайтово, конечно, записать, хотя это странно для 32-хбитной системы.

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

Ты предлагаешь мне добиться исполнения твоего неверного утверждения, и пока я не добьюсь этого, считать тебя правым. Отлично, спасибо. Нет, программист.

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

Так да)), но с n == 1 эта конструкция становиться одномерным массивом и arr[N][M] - не имеет особого смысла. Имелось ввиду большие N,M. Настолько, что массив бы вылазил за кешлайны.

UP: И код все равно хотелось бы увидеть. Может он действительно с n == 1 тестил.

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

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

Как сказал фирках, у тебя в 100% случаев в прикладном ПО на сишке все уже выровнено и этим заниматься руками не просто бесполезно, но и вредно. Что там в ядре линукс понаписано ты не понимаешь, но мнение имеешь. Как всегда.

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

Ладно, кроме шуток, ленин-то прав. Оптимизатор сведет оба кода к одному и тому же ассемблеру. Чтобы не сводил, тебе надо пометить array как volatile и вот тогда начинаются приключения:

$ cat fast.c
#include <stdlib.h>

#define N 16384
#define M 16384

int
main(void)
{
	volatile static int array[N][M];

	for(int i = 0; i < N; i++)
		for(int j = 0; j < M; j++)
			array[i][j] = rand();
	return 0;
}
$ cat slow.c
#include <stdlib.h>

#define N 16384
#define M 16384

int
main(void)
{
	volatile static int array[N][M];

	for(int j = 0; j < M; j++)
		for(int i = 0; i < N; i++)
			array[i][j] = rand();
	return 0;
}
$ gcc -O2 -o fast fast.c
$ gcc -O2 -o slow slow.c
$ time ./fast
./fast  2.96s user 0.15s system 99% cpu 3.111 total
$ time ./slow
./slow  4.38s user 0.17s system 99% cpu 4.555 total
cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 5)
Ответ на: комментарий от untitl3d

Как сказал фирках, у тебя в 100% случаев в прикладном ПО на сишке все уже выровнено и этим заниматься руками не просто бесполезно, но и вредно.

Почитать тебе вслух код nginx или сам справишься?

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

Смешно читать двух клоунов (виртуалов?) несущих одну методичку с разной степенью агрессивности и слабоумия.

Почитайте для начала зачем в си ввели alignment. C99 6.3.2.3 и как оно связано с линейностью памяти.

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

Смешно читать двух клоунов (виртуалов?) несущих одну методичку с разной степенью агрессивности и слабоумия.

Не юли. Ты отрицаешь наличие ручных выравниваний в коде nginx или нет?

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

Прочитай да. И не забудь объяснить что и для чего там сделано. Я тебе сразу подскажу: упоротый неумелый погромист обходит таким образом UB потому что ниасилил нормальную архитектуру.

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

Прочитай да. И не забудь объяснить что и для чего там сделано.

Чтобы эффективно попадать в кеш. В Linux оно тоже для этого. До сих пор удивляюсь почему слова cache и line никак не могут навести тебя на нужную мысль.

Я тебе сразу подскажу: упоротый неумелый погромист обходит таким образом UB потому что ниасилил нормальную архитектуру.

Нет, не угадал. Попробуй ещё раз.

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

Ну если кроме шуток), то это не так.

На всякий случай код на нормальный бечмарк:

#include <stdlib.h>

#define N 1000
#define M 1000

static void testArr1(benchmark::State& state) {
  // Code inside this loop is measured repeatedly
  for (auto _ : state) {
    int arr[N][M];
    for(int i = 0; i < N; i++)
      for(int j = 0; j < M; j++)
        arr[i][j] = rand();
    // Make sure the variable is not optimized away by compiler
    benchmark::DoNotOptimize(arr);
  }
}
// Register the function as a benchmark
BENCHMARK(testArr1);

static void testArr2(benchmark::State& state) {
  // Code inside this loop is measured repeatedly
  for (auto _ : state) {
    int arr[N][M];
    for(int j = 0; j < M; j++)
      for(int i = 0; i < N; i++)
        arr[i][j] = rand();
    // Make sure the variable is not optimized away by compiler
    benchmark::DoNotOptimize(arr);
  }
}
// Register the function as a benchmark
BENCHMARK(testArr2);
PRN
()
Ответ на: комментарий от cumvillain

Если ты тестиркешь

main(void)
{
	int array[N][M];

	for(int j = 0; j < M; j++)
		for(int i = 0; i < N; i++)
			array[i][j] = rand();
	return 0;
}

без volatile static то компилятор всю машинерию может выкинуть. Именно для этого нужен benchmark::DoNotOptimize(arr);.

Тестируй правильно

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

Онлайн бенч на C я не знаю). Я на нем не пишу. И то что компилятор может выкинуть все, что связано с array без его использования, это не отменяет! Т.е. бенч

main(void)
{
	int array[N][M];

	for(int j = 0; j < M; j++)
		for(int i = 0; i < N; i++)
			array[i][j] = rand();
	return 0;
}
  • не корректен не зависимо от языка.
PRN
()
Последнее исправление: PRN (всего исправлений: 1)
Ответ на: комментарий от PRN

Да, без использования массива или volatile цомпилятор все может выкинуть. Или свести к оптимальному виду. Но вероятно ленин про это не знает.

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

Ну так это вы из Си хотите Жабу сделать, а не я. Си максимально близок к железу. Если тебе не нужна такая интимная близость, то не пиши на Си. У процессора нету поддержки безопасных массивов, следовательно ее нужно будет костылять в рантайме, но Си язык без рантайма. Это сложно?

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

Огнелис.

Который десятилетия успешно жил как проект на C/C++. Потом в него затянули доли процента Rust, и для красивых цифр в пропагандистских материалах склонировали зависимости прямо в репу – прямо как вендузятные проекты делают.

Дискорд.

На расте написана серверная составляющая, причем с Go ее переписали на Rust гораздо позже того, как дискорд набрал популярность. Вернее, так утверждается ими самими – исходный код закрыт, и в реальности там может быть хоть пхп.

Думаю, fish достаточно популярен, как альтернатива bash.

Это какой-то позор. Fish на Rust автор решил переписывать меньше года назад, что совершенно неудивительно – если посмотреть на исходники, там тотальный анскил.

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

Ага. Ядер стало в 128 раз больше. Процессоры могут выполнять больше одной инструкции за раз. Поддержки всего этого в сишке нет.

Зато, в процессорах изгаляются как могут, чтобы создать видимость серийного исполнения. Привет speculative execution.

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

Зато, в процессорах изгаляются как могут, чтобы создать видимость серийного исполнения

Это называется микроархитектурой.

Поддержки всего этого в сишке нет

Не модно, выходит.

Привет speculative execution

Влив — это коммунизм, он когда-то настанет.

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

Это называется микроархитектурой.

Это называется костыль.

Влив — это коммунизм, он когда-то настанет.

А это тут вообще не при чем. Векторные инструкции прекрасно себе работают и без vliw. Правда их в сишке тоже нет.

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

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

Лол нет. С двух аккаунтов тут никто тебя не троллит. У меня только один аккаунт на ЛОРе. Но раз тебе мерещится заговор везде, то ок. Кстати, Макском – это тоже я.

Что там в ядре линукс понаписано ты не понимаешь, но мнение имеешь.

Про ядро тебе другой чувак писал. Я всего лишь на него ссылаюсь. Иди с ним общайся.

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

На самом деле, тут достаточно выделять массив динамически и за пределами модуля. Если ты цикл сунешь в функцию, которая будет получать параметрами (int **arr, const int w, const int h), оптимизатор заткнётся и не будет ничего переделывать. Чтобы тут сработала оптимизация, надо повсюду restrict совать, но кто ж это из сишников-то делает?

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

Огнелис.

Который десятилетия успешно жил как проект на C/C++. Потом в него затянули доли процента Rust, и для красивых цифр в пропагандистских материалах склонировали зависимости прямо в репу – прямо как вендузятные проекты делают.

Настолько успешно, что перцы из Мозиллы аж целый Rust придумали. Ведь не могли просто так на Rust перейти, как это нормальные проекты делают сейчас. Нет! Им пришлось его изобрести!

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

Только они плюсы замещали, а не си.

Если точнее, они замещали сишную часть плюсов. Потому что если из плюсов выкинуть си и добавить щепотку окамла, то получится… Rust!

Серьёзно, плюсы могли бы быть нормальным языком, если бы не вот эта вот вся сишная говнина.

А если безопасно подумать?

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

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