LINUX.ORG.RU

defer в C быть!

 ,


0

9

Привет, ЛОР!

Как я писал три года назад, в стандарт языка Си было предложено добавить выражение defer, выполняющее функцию или блок кода по выходу из области видимости, где оно было объявлено.

На днях данное предложение получило официальный статус и, скорее всего, defer появится в будущем стандарте C2y.

При этом, defer почти наверняка не будет добавлен в C++, так как его использование будет конфликтовать с другими частями этого языка.

Ссылка на пост в блоге автора: https://thephd.dev/c2y-the-defer-technical-specification-its-time-go-go-go

Спецификация: https://thephd.dev/_vendor/future_cxx/technical%20specification/C%20-%20defer/C%20-%20defer%20Technical%20Specification.pdf

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

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

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

и в крайнем случае прикручивание какого-нибудь jemalloc

Зачем его прикручивать, он и так дефолт.

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

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

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

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

Какое ещё внутри процесса? Ты запускаешь новый процесс, память ему только что выдана ОС. А после того как он уже запущен, никакие переменные и не надо уже инициализировать.

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

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

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

Не было. Возможно ты путаешь с передачей по ссылке (словом var - аналогичное есть в С++ ещё когда там & ставят).

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

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

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

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

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

Это не «мусор в сигнатуре», это передача по ссылке - то есть передаётся указатель на самом деле. В Си это более явно делается (звёздочка в прототипе и & при вызове, в С++ можно сделать & в прототипе и ничего не указывать при вызове).

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

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

комментарии пишут к непонятным и нетривиальным кускам кода. и к функциям (иногда), если не очень понятно, что они делают.

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

спорить не буду. я уже не помню паскаль. последний раз я его видела в 2000 году, наверное.

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

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

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

я, честно говоря, не поняла, напуркуа там body.

потому что тело может быть где угодно между этими строками например

int i = a;
while (i <= b) {
  if (i >= b) break;
  // body
  i++;
}
int i = a;
while (i <= b) {
  if (i >= b) break;
  i++;
  // body
}
anonymous
()
Ответ на: комментарий от anonymous

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

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

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

Слишком много управляющих конструкций.

Борьба с «чудовищными костылями». Я пишу минимальный патч для страндартной/типовой конструкции цикла.

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

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

но вы тут не старенькие. так что не надо прибедняться. пощады не будет :)

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

Теперь задача со звёздочкой: шаг цикла отличается от 1.

Rust умеет решать такие задачи со звездочкой?

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

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

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

Отвечу себе.

Умеет через чудовищный костыль, ой, реализацию trait StepBy.

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

Не больше чем в твоём коде. if() for() специально в одной строке т.к. это единая конструкция. Впрочем, первого if-а может не быть, если мы точно знаем что диапазон корректный.

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

тогда лучше влепить туда функцию и пусть юзер снаружи её определяет. впрочем, конечно, зависит от «тела». может. там такая мелкая фигня, что и функции для неё не нужно.

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

Вместо этого проще (и понятнее) цикл с goto.

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

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

Ты выше про переполнение и -fwrapv не знала. Come on! Кому ты залечиваешь-то?

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

так я не использую UB, детка. тебе ещё раз написать, что UB использовать не надо и переполнение - это ненормально.

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

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

так я не использую UB, детка.

Что значит фраза «я не использую UB»? UB – это ошибка в коде. Если ты мне сейчас начнёшь рассказывать, что пишешь код всегда на 100% без багов, тебе никто вообще не поверит.

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

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

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

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

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

Что «да»? Повторюсь: я не верю, что ты пишешь код без багов. И я на 100% уверен, что в твоём коде где-то да есть UB. Не твоя вина, на самом деле – это общая проблема языка Си, и именно поэтому я его тут и обсираю. Си без UB без бы гораздо лучшим языком.

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

Я тебе ссылку на CVE зачем дал? Там только в этом году только в ведре лялекса несколько дыр из-за integer overflow нашли. Не встречаются в реальной жизни, ага. Конечно.

UB, правда, не при делах, потому что лялекс собирают с -fwrapv.

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

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

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

я не верю

я не капеллан, я не работаю с религиозными убеждениями. ничем помочь не могу. однако, я работаю в разработке с 2000 года и пока что проблем не было. ну а изучать Си я начала где-то в 89-м году.

потому что лялекс собирают с -fwrapv.

чего вы к нему пристали? его собирают со всеми возможными флагами безопасности, чтобы уберечь от случайных падений из-за возможных багов в коде. но это не значит, что кто-то там намеренно использует UB с переполнением.

Кому должно?

здравому смыслу. потому что переполнение - это ненормальная ситуация в 99.9999% случаев.

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

Си без UB без бы гораздо лучшим языком.

Возьмём лучший язык Rust, безопасно работающий с памятью. В нем есть умные указатели со счетчиком ссылок std::rc. Висящие в памяти зацикленные указатели - это что: определенное или неопределенное поведение?

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

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

Что значит «проблем не было»? Типа, их не нашли?

чего вы к нему пристали? его собирают со всеми возможными флагами безопасности, чтобы уберечь от случайных падений из-за возможных багов в коде. но это не значит, что кто-то там намеренно использует UB с переполнением.

Чо? -fwrapv делает знаковое переполнение определённым, т.е. заставляет компилятор не генерить лютый говнокод типа того что @zurg тут приводил.

Ты реально этого не понимаешь, что ли?

здравому смыслу. потому что переполнение - это ненормальная ситуация в 99.9999% случаев.

Здравый смысл и программирование на Си – очень далёкие друг от друга понятия.

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

Типа, их не нашли?

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

в кернеле нет лютого говнокода. перестань зацикливаться на этом.

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

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

Чо? -fwrapv делает знаковое переполнение определённым, т.е. заставляет компилятор не генерить лютый говнокод типа того что @zurg тут приводил.

Чо-чо. Если переполнение определено, его можно обнаруживать своими силами. и бороццо.

и флага -ftrapw там рядом не стоит в этом вашем «ядре»?проверьтесь.

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

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

Если это так, то необходимо проверить сгенерированный код.
Можете привести Си и сненрированный для него код?

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

К сожалению, он там бывает и нередко. Например, попытка drm_kms_helper'ом прочитать edid из зафриженной файловой системы, приводящая к дедлоку
Да и чего только стоят разваливающиеся списки в bluetooth коде, которые лет 5 минимум не могли починить...
В общем, говнокода в кернелах хватает, нередко такого, что мешает ядром нормально пользоваться

mittorn ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)