LINUX.ORG.RU

В стандарт C предложено внести лямбды и defer из golang

 , ,


5

6

Привет, ЛОР!

Я тут тебе немного покушать принёс. Как ты, наверное знаешь, не за горами выход нового стандарта языка C – C23. Среди прочих вкусностей, таких как лямбды в стиле C++, в этот стандарт предложено добавить механизм defer, аналогичный существующему в языке Go.

Ссылка на предложение: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2895.htm

В случае, если этот стандарт будет принят, будет возможно написание вот такого кода:

p = malloc(N);
defer { free(p); }

Где аргументом оператора defer является анонимная функция. Так же возможны более сложные варианты использования:

enum { initial = 16, };
double buffer[initial] = { 0 };
...
size_t elements = 0;
double* q = buffer;
defer [orig = q, &q]{ if (orig != q) { free(q); }};
...
// increase elements somehow
...
// adjust the buffer
if (elements > initial) {
    double* pp = (q == buffer) ? malloc(sizeof(double[elements])) : realloc(q, sizeof(double[elements]));
    if (!pp) return EXIT_FAILURE;
    q = pp;
}
...

Учитывая всё это, скоро в C больше не будет нужно использовать goto вообще нигде, даже для очистки ресурсов при ошибке. Так заживём, ЛОР!

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

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

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

Я ж говорю - return, а там трава не расти. Зачем, почему, для чего, что будет дальше - совершенно насрать.

У тебя и так и так функция схлопнется же лол! Только вместо того, чтобы залогировать ошибку, чтобы хотя бы было понятно что произошло, ты обильно логируешь мимо буфера прямо себе в штаны.

hateyoufeel ★★★★★
() автор топика

Нет в сишечке кнопки «зашибись!». Печалька.

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

Вам показали обсер, а вы: «А ты докажи что говно из штанов сможет вывалиться!». И кто тут шлангует?

btw, a[n] при n < 0 - это UB. Но вам, конечно, эти буквы ни о чем не говорят. Или говорят что-то там про общественный транспорт и глобальное потепление.

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

Ого. А я и не знал. СПАСИБО!

Мне кажется они не приходя в сознание строчат. Еще про обсёр что-то, что просто какая-то ирония судьбы :-D

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

Там вроде тока чужой код же.

Надеюсь няшу это не остановит, всё таки оркестр должен играть.

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

Какому-нибудь расту - уже больше 10 лет. За это время на нём не написано вообще ничего полезного. Совсем. Абсолютно ничего. При всём беспардонном маркетинге.

список написанного тут Какие новые и полезные, известные, или хотя бы красивые программы написаны на Расте?

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

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

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

Да очень просто:

$ cat smash.c
#include <stdio.h>

typedef void (*function_t)(void);

static void
ok(void)
{
	printf("ok\n");
}

static void
smash(void)
{
	function_t f = ok;
	unsigned char buf[8];

	buf[-1] = 0xff;
	f();
}

void
main(void)
{
	smash();
}
$ gcc -ggdb -o smash smash.c && ./smash
zsh: segmentation fault (core dumped)  ./smash
anonymous
()
Ответ на: комментарий от BceM_IIpuBeT

О, а хочешь ещё одну?

У @Stanson’а есть вот такая строчка:

    char		buf[4096], *s, *to = "";

А теперь смотри:

$ cat smash.c
#include <stdio.h>

static void
ok(void)
{
	printf("ok\n");
}

static void
smash(void)
{
	char buf[4096], *to = "";

	buf[-1] = 0xff;

	if (to[0] == 0)
		ok();
}

void
main(void)
{
	smash();
}
$ gcc -Wstack-protector -ggdb -o smash smash.c && ./smash

ОП.

P.S. Я сперва лолировал, но теперь мне реально страшно что подобные вещи нужно объяснять в 2022 году в Development oO.

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

пишешь ты, а стыдно мне. :’]

Стыдно нам всем, а должно быть @Stanson’у и @Iron_Bug.

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

Я хочу увидеть вот это: *** stack smashing detected ***: terminated

ретгарды стоят перед ret, через buf[-1] их разве что оверврапом можно побить. Мне тоже было интересно что имел в виду @hateyoufeel, то падения при порче стека в рандомных местах это не отменяет вообще никак.

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

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

Братишка! Да, я тоже лямбды только в Хаскеле встречал, Лисп пока ещё не изучал. Такое непотребство, как в приплюснутых в Си не надо, могли бы сделать и покрасивее! Хотя я их успешно и использовал.

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

И не только Владимир.

Владимир.

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

ретгарды стоят перед ret, через buf[-1] их разве что оверврапом можно побить

Да, но штука в том, что на разных архитектурах стек растёт в разную сторону. ARM, например, умеет и туда и туда, там инструкции для работы со стеком имеют две (на самом деле, четыре) версии.

Мне тоже было интересно что имел в виду @hateyoufeel, то падения при порче стека в рандомных местах это не отменяет вообще никак.

Я имел ввиду, буквально, что код товарища @Stanson срёт в стек мимо буфера.

Владимир

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

@Stanson, ты умудрился обосраться даже с ретгардами, хотя это казалось невозможным. Тебе не стыдно?

Владимир

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

Только вместо того, чтобы залогировать ошибку, чтобы хотя бы было понятно что произошло

Куда залоггировать? :) Диск отвалился же. :) И что делать-то с таким файлом, который открывается, но не читается?

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

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

Куда залоггировать? :) Диск отвалился же. :)

Да куда угодно. Алсо, диск не обязательно должен отвалиться, чтобы такая лажа случилась: В стандарт C предложено внести лямбды и defer из golang (комментарий)

И что делать-то с таким файлом, который открывается, но не читается?

Мы уже поняли, что ты патологически не можешь не срать в стек.

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

Куда залоггировать? :) Диск отвалился же. :)

А просто занулить буфер и не срать мимо него – не путь джедая?

И что делать-то с таким файлом, который открывается, но не читается?

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

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

Скучно. Уже третью-пятую страницу повторяете как попугаи что «надо проверить read», толком не понимая зачем. Просто надо, иначе плохо. Выше, вон, няша обосралась с срывом стэка, что на очереди? Может всё таки код айрон-баг прогоним линтерами, а, растаманьки?! :-D

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

Скучно. Уже третью-пятую страницу повторяете как попугаи что «надо проверить read», толком не понимая зачем. Просто надо, иначе плохо. Выше, вон, няша обосралась с срывом стэка, что на очереди? Может всё таки код айрон-баг прогоним линтерами, а, растаманьки?! :-D

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

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

За щёку вы насовать можете разве что своему коллеге-растаману, затравив его в очередной раз за то, что он «неправильно пишет хелловорд». Помнишь такое? А я помню того бедолагу. :-D Сообщество клоунов, а не программистов. Умора.

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

Сообщество клоунов, а не программистов.

Ну вот, умничка, теперь ты все понял. Упоротые сишники – сообщество клоунов.

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

Да куда угодно.

Я ж говорю - тут мы жопу себе прикрыли, а на всё, что вне нашего зашоренного взора - насрать совсем. :)

Алсо, диск не обязательно должен отвалиться, чтобы такая лажа случилась

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

Мы уже поняли, что ты патологически не можешь не срать в стек.

Ну а мы поняли, почему ничего полезного на хипстерских язычках никто так и не написал и никогда не напишет.

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

А просто занулить буфер и не срать мимо него – не путь джедая?

Риск насрать мимо настолько ничтожен, что я лучше ещё подумаю, как обработать правильно эту крайне маловероятную ситуацию в версии программы с номером 0.1. :)

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

Откуда такое дикое нежелание увидеть всю картину целиком? Есть только функция и ничего кроме неё существует? Для чего она, какая задача вообще - насрать?

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

То есть буквально «у меня работает».

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

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

Да вы же упоротые наглухо!

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

– Чувак, у тебя вот тут ошибка в коде.

– Да вы же упоротые! Такого никогда не будет! Кто в здравом уме проверяет ошибки? Никогда так не делаю!

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

Нет, всё выглядит совершенно иначе:

  • Кто-то теоретически может чихнуть! Надо срочно абсолютно всем надеть намордники, сидеть дома и ширяться непонятным шмурдяком!!!1111

Продолжайте, не стесняйтесь, ваши «успехи» говорят сами за себя.

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

Это ты шмурдяком ширнулся что тебя так тырчит? Многое объясняет, кстати. Я вот не ширяюсь, и мои волосы гладкие и шелковистые. Заодно я и мимо буфера в стеке не сру. В общем, рекомендую.

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

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

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

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

А я буду в это время перебирать пальцами твои шелковистые волосы и поправлять твоё платье.

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

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

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

Я так понимаю слова T10 PI и SDC для тебя пустой звук, да?

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

Не, погоди, как связаны проверка буферов в C и ширяния шмурдяком? Я не очень понимаю, о чём ты сейчас. И как связаны Rust и тот факт, что ты не умеешь программировать? Если бы ты на C умел программировать, вопросов бы таких не было. Но тут тебя стебут именно за то, что ты программировать не умеешь, хоть и заявляешь обратное. Ты точно не ширяешься?

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