LINUX.ORG.RU

libmui — библиотека для интерфейсов в стиле MacOS Classic

 , , ,

libmui — библиотека для интерфейсов в стиле MacOS Classic

5

4

Привет, ЛОР!

Пару дней назад был опубликован код библиотеки libmui, которая позволяет создавать интерфейсы пользователя, напоминающие операционную систему MacOS Classic. API библиотеки также вдохновлён этой ОС.

Библиотека написана на языке C и отличается минимальным набором зависимостей. Поддерживается работа только в средах X11, поддержка Wayland автором не планируется.

Код опубликован под лицензией MIT.

>>> Подробности

★★★★★

Проверено: hobbit ()
Последнее исправление: CYB3R (всего исправлений: 3)

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

Сделает. Когда у вас структура неизвестного размера с абы какими данными понять, где именно случилось проблема очень сложно, ведь она случается в РАНТАЙМЕ! Причем средств для диагностирования этих проблем просто нет.

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

Ага. Ну и как работает следующий код?

struct Some
{
  int a;
  char b[];
};

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

Когда у вас структура неизвестного размера с абы какими данными понять, где именно случилось проблема очень сложно, ведь она случается в РАНТАЙМЕ!

А это и без VLA можно делать. Например, частая тема:

struct s {
  size_t sz;
  char data[];
};

struct s* alloc_s(size_t sz) {
  struct s *s = malloc(sz + sizeof(struct s));
  if(s != nullptr)
    s->sz = sz;
  return s;
}

Такое уже лет 20 существует.

UPD:

Ага. Ну и как работает следующий код?

лол хайвмайнд! Отлично работает следующий код :DDD

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

Какой в жопу VLA? C! CVE LANGUAGE! Ошибся в длине буфера переписал половину программы, не туда переменную поставил датагонку получил. Но нет, ВОТ С VLA-ТО НАЧНЕТСЯ.

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

А это и без VLA можно делать. Например, частая тема:

Только не char data[], а char *data.

Приведенная мной запись выше означает, что размер массива (и структуры соответственно) будет задаваться в рантайме.

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

Ага. Тип, размер которого не известен на момент компиляции. Действительно, ничего не усложняет…

Так да, не усложняет. Тебе void *ptr в каждом втором интерфейсе же не усложняет? Почему vla должен?

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

Потому что это невозможно отлаживать. И вместо явного выделения на стеке через alloca появилось неявное.

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

Приведенная мной запись выше означает, что размер массива (и структуры соответственно) будет задаваться в рантайме.

Ну, да. Всё так. А что плохого-то? В гнутом говне это ещё до C99 ёмнип появилось, только там надо было 0 в объявлении структуры писать.

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

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

От того что ты миллион раз это повторишь, оно понятнее не станет. Чем это от void *ptr с точки зрения отладки отличается?

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

Нет, не правильно. В «замечательном» C99 char data[] в структуре означает, что массив будет иметь такой размер, какой получится в результате его инициализации.

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

void * имеет понятный размер и предсказуемое поведение. Собственно он может либо указывать на сущность, либо на 0, либо на сущность, которой более не существует.

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

Какой бесполезный ответ. За void *ptr прячется нечто, вычисляемое в рантайме. Более того, в зависимости от внешних условий там может быть struct *foo или struct *bar. Все ядро на этом построено, например. Или плагины в nginx. И ничо, никто не умер.

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

0 в объявлении структуры писать.

Это другая штука.

VLA удобны тем, что ты можешь сделать функцию вида void foo(int n, char a[n]), и компилятор понимает, что n – это длина массива a. Не просто разраб понимает это тайное знание, но и компилятор.

Это может быть полезно в том числе и для более надёжного кода и для продвинутых средств анализа когда.

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

Смысл FAQ в том, что автор делает для своей системы, а вовсе не бесплатно удовлетворяет чьи-то хотелки. Хочешь SDL пиши сам.

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

Обычно void * используется для того, чтобы «пробросить» через какое-нибудь API указатель. Т.е. функция имеет вид void f (void *), потому что какой-то библиотеке надо получить указатель вида void (ptr*)(void*). При этом сама пользовательская функция внутри себя обратно кастует void * к указателю на нужный тип.

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

Обычно void * используется для того, чтобы «пробросить» через какое-нибудь API указатель. Т.е. функция имеет вид void f (void ), потому что какой-то библиотеке надо получить указатель вида void (ptr)(void*). При этом сама пользовательская функция внутри себя обратно кастует void * к указателю на нужный тип.

Да. Ты обдолбался и получил сегфолт, потому что скастовал не в ту структуру. Твои действия? Чем это отличается от того, что ты обдолбался и неправильный размер VLA массива использовал?

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

Ещё немного и сишники изобретут параметрические типы. Они, собственно, в C уже давно есть на уровне компилятора, просто свои делать нельзя.

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

Кстати, это вроде UB. Т.е. может произойти что угодно.

Ошибиться с VLA очень легко. Ошибиться с кастом указателя намного сложнее. Ты хочешь, чтобы функция получала struct Some *, поэтому пишешь void * и в первой же строчке обратно к struct Some * приводишь.

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

Кстати, это вроде UB. Т.е. может произойти что угодно.

Ага. Обращение к невалидной памяти это UB. Отлаживать-то как будешь, если тебя так рантайм пугает?

Ошибиться с VLA очень легко.

Не сложнее чем с обычным массивом. И не легче. Буквально так же.

Ошибиться с кастом указателя намного сложнее.

Ахаахахаха. Нет.

Ты хочешь, чтобы функция получала struct Some *, поэтому пишешь void * и в первой же строчке обратно к struct Some * приводишь.

А ещё ты проверяешь границы буфера и не выходишь за него. И use-after-free не делаешь. И много чего ещё. Все эти ошибки прекрасно дебажатся с gdb, VLA тут вообще ничего не добавляет.

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

Ну его даже gdb умеет, г-ди:

$ cat test.c                                       
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
	int n = 10;
	int a[n];

	printf("sizeof (a) = %zu\n", sizeof(a));
	abort();
	return 0;
}
$ gcc -std=c11 -ggdb -o test test.c
$ ./test 
sizeof (a) = 40
zsh: IOT instruction (core dumped)  ./test
$ coredumpctl debug -A "-batch -ex 'frame 3' -ex 'print a'" 
[...]
Program terminated with signal SIGABRT, Aborted.
#0  0x00007ba239a6f32c in ?? () from /usr/lib/libc.so.6
#3  0x00005ab569f251d6 in main () at test.c:11
11		abort();
$1 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 1)
Ответ на: комментарий от wandrien

malloc очень сложно вызвать. Надо указать размер в байтах и все... Ну и полученный указатель сравнить с нулем.

memcpy тоже очень сложно вызвать. Никто не справляется.

Вот вы серьезно? Такие пустяковые вещи вызывают у вас проблемы?

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

Вот вы серьезно? Такие пустяковые вещи вызывают у вас проблемы?

Это… основа, я бы сказал, база, сишного мирка. Никто не умеет безопасно писать на C. У всех когда-либо были тупые баги с off-by-one.

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

Что значит «безопасно»? Ошибки можно допустить везде. Покажите мне язык, где обращение к элементу массива за его границами не ведет к неопределенному поведению / исключению.

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

Вот вы серьезно? Такие пустяковые вещи вызывают у вас проблемы?

Тот же вопрос про VLA.

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

Что значит «безопасно»? Ошибки можно допустить везде. Покажите мне язык, где обращение к элементу массива за его границами не ведет к неопределенному поведению / исключению.

Отлично, тогда почему ты так прицепился к VLA? Мы уже выяснили, что разницы между VLA и массивом в плане надеженности тупо нет, там одинаковый класс проблем.

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

Покажите мне язык, где обращение к элементу массива за его границами не ведет к неопределенному поведению / исключению.

Сотни их. Но это тут ни при чём.

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

Компилятор не должен ничего понимать. «Си — это кроссплатформенный ассемблер». В цели этого языка не входит предоставление высокоуровневых абстракций. Вы же не требуете аналогично, например, от FASM. Почему вы этого требуете от Си? Что вы написали, то он и сгенерировал. Если что-то не так с руками, то не надо заниматься деятельностью по «стандартизированию» Си, а надо чинить собственные руки.

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

Компилятор не должен ничего понимать. «Си — это кроссплатформенный ассемблер». В цели этого языка не входит предоставление высокоуровневых абстракций. Вы же не требуете аналогично, например, от FASM. Почему вы этого требуете от Си? Что вы написали, то он и сгенерировал. Если что-то не так с руками, то не надо заниматься деятельностью по «стандартизированию» Си, а надо чинить собственные руки.

А это вообще полный бред. В компиляторе C оптимизатор на два миллиона строк, C ОЧЕНЬ старается сгенерировать не то, что ты написал, а то, что будет быстрее работать.

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

Что вы написали, то он и сгенерировал.

АУЫАУАУАУАУААЫЫЫЫЫЫЫЫЫЫЫЫ

То-то блин в шланге с гцц по миллиону с лишним строк в каждом, которые делают просто чудовищные вещи с твоим сишным кодом.

В цели этого языка не входит предоставление высокоуровневых абстракций.

Только C это делает на каждый чих.

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

Это не отменяет того, что и шланг и гцц говно. Их авторы занимаются какой-то фигней, которая только уродует язык.

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

Это не отменяет того, что и шланг и гцц говно. Их авторы занимаются какой-то фигней, которая только уродует язык.

Без этой фигни ты бы не мог бегать и рассказывать всем, какой C быстрый. ПОтому что C с -O0 сливает даже голангу.

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

Нет, я не против UB. Оптимизатор может делать что хочет, пока это не нарушает задумку автора. Как только он начинает требовать от программиста лишнего (вроде того же strict aliasing), он становится только вредным.

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

Зато бред про ололо компилятор компилит код как есть - шикарный)

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

Это не отменяет того, что и шланг и гцц говно. Их авторы занимаются какой-то фигней, которая только уродует язык.

Их авторы реализуют стандарт языка. Причём с религиозным упорством. Соответственно, все вопросы к авторам этого стандарта.

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

Компилятор компилирует не то, что ты ДУМАЕШЬ, что написал, а то, что ты написал по факту.

Он не доморощенный литературный критик на ютубе, чтобы раскрывать «задумки автора».

Отмазка реально звучит в стиле сектантов плоской Земли.

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

И почему-то никто не осмеливается сказать, что одна конкретная организация пишет какие-то писульки, которые каким-то боком влияют на работу других программистов, не самым, мягко говоря, удачным образом. Речь про ISO.

Почему-то к спецификации ANSI вопросов ни у кого нет. Я ни разу не видел, чтобы кто-то заявлял, что ANSI C — плохая спецификация.

Почему-то к K&R спецификации тоже ни у кого вопросов нет. Опять-таки я никогда не видел критики в адрес K&R C.

Зато к деятельности ISO вопросов масса. Причем как у программистов Си, так и Си++.

Я не удивлюсь, если спецификацию Си, которую разработают пара-тройка ученых (вчерашних студентов) будет лучше, чем вся «продуктивная деятельность» ISO за последние 25 лет.

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

И почему-то никто не осмеливается сказать, что одна конкретная организация пишет какие-то писульки, которые каким-то боком влияют на работу других программистов, не самым, мягко говоря, удачным образом. Речь про ISO.

ISO не пишет стандарт C. Стандарт пишут чуваки из контор типа Гугеля или Микрософта.

Почему-то к спецификации ANSI вопросов ни у кого нет. Я ни разу не видел, чтобы кто-то заявлял, что ANSI C — плохая спецификация.

ANSI C – плохая спецификация, ведь именно в ней появился такой термин как UB.

Алсо, ANSI тоже не писали стандарт. Его писали чуваки из всяких AT&T и прочих IBM.

Почему-то к K&R спецификации тоже ни у кого вопросов нет. Опять-таки я никогда не видел критики в адрес K&R C.

K&R C – полное говно. А ещё, K&R C не является спецификацией.

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

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

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

K&R C – полное говно.

Конкретики не будет.

А ещё, K&R C не является спецификацией.

Это именно что спецификация, а не стандарт.

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