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

Каждый вызов оборачиваешь проверкой и падаешь в случае чего.

Эта штука не должна падать вообще. В этом её суть. Я её написал-то только потому что какие-то консольные жаббероклиенты на пистоне и ещё чём-то переставали работать через некоторое время. Ну и в микродевайсы всякие типа роутера вместе с пистоном не влезали.

Так что падать не вариант. Надо правильно обработать ошибку. Но я затрудняюсь представить что надо делать если возникла такая ситуация. Тем более что в качестве директории для спула я пользую tmpfs. Если на tmpfs файл открылся на чтение, но не прочитался, то скорее всего, судьба этой фитюльки это самое последнее о чём надо будет заботиться.

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

buf[-1]=0

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

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

Чувак, ты на собеседовании, когда покажешь свой код, так же оправдываться будешь?

Я не хожу на собеседования, я их изредка провожу.

Нет, это я про тебя и как ты мимо буферов срёшь в коде. Как и все сишники, в общем-то.

Ну и когда несишники, наконец выкатят хоть что-то, чем будут пользоваться миллиарды? Судя по твоей статистике CVE (всего 70% CVE - сишный код работающий 99% времени в мире), ничего хорошего нас вообще не ждёт.

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

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

Facebook написан на PHP.

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

Я не хожу на собеседования

Потому что там тебе указывают, как ты мимо буфера какаешь?

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

Ты что, рекламу жабы не видел? Больше 4 миллиардов девайсов работают на жабе! Из этого столько мемов клепали ещё.

И наверняка во всём этом жабакоде ни одного просранного буфера нет! А в твоём есть!

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

О, ещё один нелюбитель сишечки.

Расскажи же скорее, что надо делать, если файл открылся на чтение, но чтение завершилось с ошибкой. При этом файл в директории оставлять нельзя. Прекращать выполнение программы нельзя.

И заодно расскажи в каких случаях такое может произойти в линуксе, на ext234 или tmpfs, а то может в таком случае gpio надо дёргать, чтобы питание отрубить, а не о стеке заботиться.

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

Расскажи же скорее, что надо делать, если файл открылся на чтение, но чтение завершилось с ошибкой.

Я точно знаю, что делать не надо: не надо срать мимо буфера! А дальше есть куча вариантов.

При этом файл в директории оставлять нельзя.

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

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

И заодно расскажи в каких случаях такое может произойти в линуксе, на ext234

Диск отвалился, например. Сплошь и рядом. Ты вообще продакшон в глаза-то видел?

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

Facebook написан на PHP.

И сам PHP и сервер, и ОС, тоже на PHP? Или, всё-же 99.9999% времени выполняется сишный код?

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

Да я понимаю, сам не обрабатываю каждый системный вызов, просто потому что надо, карл, надо!!! Всё зависит от условий среды выполнения, цены ошибки, затраченных усилий, ну в общем банальностей. Я иронизировал больше на тему этих теоретиков, которые вымажутся в расте, и хотят написать что-то системное, вроде автора sway (емнип), а потом оказывается что неудобно в ластах и смирительной рубашке программировать. А вот в стандартной библиотеке раста «уязвимость» подобную твоему случаю в вакууме – нашли. Тоесть даже в этом убер-латексно-ботексном айрон мэйдене для пыток программиста – допустили такой баг. А ведь это даже не продукт для людей с полезным выхлопом. =)

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

И сам PHP и сервер, и ОС, тоже на PHP? Или, всё-же 99.9999% времени выполняется сишный код?

100% времени выполняется машинный код.

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

Да я понимаю, сам не обрабатываю каждый системный вызов

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

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

Диск отвалился, например. Сплошь и рядом.

Мда. Ну ладно. И ты считаешь что в этом случае надо заботится о стеке в какой-то фитюльке?

Ты вообще продакшон в глаза-то видел?

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

С файлами никаких чудес при этом не происходит.

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

а еще…мало кто знает, что языки программирования, придуманные при Сталине, называли в честь вождя. например СИ - Сталин Иосиф.

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

100% времени выполняется машинный код.

И сколько из этого машинного кода получилось компиляцией сишного сырца, а сколько породили другие язычки?

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

Мда. Ну ладно. И ты считаешь что в этом случае надо заботится о стеке в какой-то фитюльке?

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

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

А потом mpt3sas лажает и у тебя отваливается вся корзина :)

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

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

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

И сколько из этого машинного кода получилось компиляцией сишного сырца, а сколько породили другие язычки?

Давай начнем с того что сишные сырцы ты компилируешь плюсами.

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

Ты же понимаешь, что я уже отправлял, отправляю и буду отправлять?

Конечно нет, ты же анонимус.

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

Давай начнем с того что сишные сырцы ты компилируешь плюсами.

Давай с того, что си с плюсами (шланг для овечек). И это не учитывая твой раст, который не жилец без с++, всё верно?

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

Давай с того, что си с плюсами (шланг для овечек).

Уж не знаю для кого шланг, но GCC тоже на плюсах (сюрприз!).

И это не учитывая твой раст, который не жилец без с++, всё верно?

Все так, без LLVM полная жопа.

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

Гцц написан на сях с плюсами. Его перевели на плюсы относительно недавно. Относительно истории существования проекта.

Все так, без LLVM полная жопа.

Это с ллвм полная. А без – нету никакого раста. Вообще. Фичи раста – это заслуга плюсов/ллвм.

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

Гцц написан на сях с плюсами. Его перевели на плюсы относительно недавно. Относительно истории существования проекта.

Ыхыхы. Извини, это так не работает. Либо перевели, либо не перевели.

Это с ллвм полная. А без – нету никакого раста. Вообще. Фичи раста – это заслуга плюсов/ллвм.

Лолнет.

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

ну так написали бы на безопасном ЯП гораздо более лучший (тм) безопасный компайлер, не?

А зачем? LLVM отлично работает же.

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

А зачем?

из принципа. ну или из-за чего там на расте переписывают всякое, что и так «отлично работает же.» (с)

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

Я считаю что сисколы, которые портят память, это баг.

Несомненно.

Оправдывать порчу памяти тем что «ну никто ж не умер» – быдлокодерство.

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

Это из разряда вопросов типа «имеет ли смысл проверять не вернул ли malloc нуль». По уму - надо проверять. Обычно проверяю, возвращаю ошибку. Но ноль оно вернёт только если запрошенная память превышает размер имеющейся, ЕМНИП. Т.е. ошибка-то произошла на самом деле вовсе не в malloc, а ранее, в предыдущем коде, который привёл к запросу совершенно неадекватного количества памяти.

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

Не ошибается только тот, кто ничего не делает. Что мы и наблюдаем.

А потом mpt3sas лажает и у тебя отваливается вся корзина :)

Тогда работает резерв. А эта машина неспешно заменяется на новую.

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

из принципа. ну или из-за чего там на расте переписывают всякое, что и так «отлично работает же.» (с)

Ну перепиши, если хочется.

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

Это из разряда вопросов типа «имеет ли смысл проверять не вернул ли malloc нуль». По уму - надо проверять. Обычно проверяю, возвращаю ошибку. Но ноль оно вернёт только если запрошенная память превышает размер имеющейся, ЕМНИП. Т.е. ошибка-то произошла на самом деле вовсе не в malloc, а ранее, в предыдущем коде, который привёл к запросу совершенно неадекватного количества памяти.

Либо ты достиг лимита памяти из-за ограничений cgroups. Либо в твоем аллокаторе баг. Господи, серьезно?

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

Можно коды ошибок проверять прост. В ядре так и делают. Что тебе мешает?

Не ошибается только тот, кто ничего не делает. Что мы и наблюдаем.

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

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

Ыхыхы. Извини, это так не работает. Либо перевели, либо не перевели.

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

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

Я открыл и проверил. Там плюсы.

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

Ну вот никому и не захотелось :)

Да не осилят скриптомакаки написать llvm, не обманывай себя ;)

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

Да не осилят скриптомакаки написать llvm, не обманывай себя ;)

Как связаны cкриптомакаки с фоннатами строгой типизации?

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

Прокладкой в виде раста.

Я правильно понимаю, что авторов компилируемого языка со строгой типизацией ты называешь скриптомакаками? Л - логика.

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

Скучно с тобой. Где Владимир? Владимир!!!!

Владимир.

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

Либо ты достиг лимита памяти из-за ограничений cgroups. Либо в твоем аллокаторе баг. Господи, серьезно?

Т.е. если твоя софтина выжрала всю память - это не ошибка в софтине. Или аллокатор у тебя кривой почему-то. Ну ладно.

Можно коды ошибок проверять прост. В ядре так и делают. Что тебе мешает?

В данном случае просто не придумал как обработать правильно, только и всего. Предложи годный вариант, я с удовольствием имплементирую. :) Что должна делать прикладная программа, если отвалился диск в машине?

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

Я никогда не утверждал, что настоящий программист никогда не ошибается. Настоящий программист не ссытся при виде указателей, goto и битовой арифметики. И пишет что-то полезное и работающее. И может найти и исправить свои ошибки. А не рассказывает всем про какой-нибудь язычок с понями и дружбомагией для идиотов, который вот-вот победит сишечку.

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

А если бы не нашли, то несомненно тут же бы заткнулись и повыкидывали бы свои расты? :) Разумеется нет. Тогда в чём проблема? Можно расходиться. Я продолжу софт писать, а вы продолжите рассказывать как ваш жабораст вот-вот нагнёт сишечку.

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

Т.е. если твоя софтина выжрала всю память - это не ошибка в софтине.

А кто сказал, что твоя? Твоему юзеру могли дать в cgroups лимит памяти. И все что не лезет получает ататат при попытке аллоцироваться.

В данном случае просто не придумал как обработать правильно, только и всего. Предложи годный вариант, я с удовольствием имплементирую. :) Что должна делать прикладная программа, если отвалился диск в машине?

Проверять сисколы -_-

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

Может. Только вот людям надоело постоянно срать себе в штаны на пустом месте и они придумали более удобные языки.

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

Почему для идиотов-то? Людям надоело нарываться на одни и те же баги в сотый раз и они родили язык, позволяющий без GC не нарываться на тупые баги раз за разом. Бонусом ещё и нормальные строки, нормальные структуры данных и нормальные типы.

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

Твоему юзеру могли дать в cgroups лимит памяти. И все что не лезет получает ататат при попытке аллоцироваться.

Продолжай.

Проверять сисколы -_-

Проверил. Ошибка приехала. Дальше-то что?

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

И как это всё поможет если в тачке отвалился диск?

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

Проверил. Ошибка приехала. Дальше-то что?

А дальше ты не портишь память -_-

И как это всё поможет если в тачке отвалился диск?

Я думал шутки про то что сишный код работает на правильном железе в правильные фазы луны это шутки. Но тут пришел @Stanson.

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

Проверять сисколы -_-

Ну проверил, дальше что?

Может. Только вот людям надоело постоянно срать себе в штаны на пустом месте и они придумали более удобные языки.

И срут теперь не на пустом месте, а прелюдно под громкий смех в новостных лентах. Ты недавний toctou залатал в своих раста-скриптах? Смотри, там статика, код уязвим с первых версий. Беги, обновляй свой хелловорд, wget ... | bash.

Почему для идиотов-то?

Очевидно же.

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

А дальше ты не портишь память -_-

А дальше ты продолжаешь показывать уровень растохлёбов. Это феерично просто. :-D

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

Проверил. Ошибка приехала. Дальше-то что?

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

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

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

А может ты перестанешь отправлять туда уязвимости? Я слышал, это помогает.

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

А может ты перестанешь отправлять туда уязвимости? Я слышал, это помогает.

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

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

Тоесть и ты не можешь ответить на вопрос как хэндлить? Клоуны вы, а не программисты. :-D

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

@Stanson, залогинься. Я уже ответил, как конкретно в этом случае обработать ошибку: ровно так же, как ты обрабатываешь ошибку open() пятью строчками выше. Только сообщение об ошибке поправь после копипасты и не забудь закрыть fd.

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