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 вообще нигде, даже для очистки ресурсов при ошибке. Так заживём, ЛОР!

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

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

Правильно ли я понимаю, что вот эти ваши слова:

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

Следует рассматривать на полном серьезе?

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

Учитывая, что этот чел не делает fstat() и ISDIR(st.st_mode), его код тупо навернётся если ему директорию подсунуть вместо файла.

Но да, ситуация описывается примерно вот так:

- АААА Я НЕ ЗНАЮ ЧТО ДЕЛАТЬ
- Ну закрой fd и выйди
- ЫАЫАЫАЫААЫЫАЫ МНОГИЕ СЛЕДСТВИЯ КОРОНОБЕСИЕ ДЕГРАДАЦИЯ ВСЕ ТУПЫЕ ЫЫЫЫ 11 СЕНТЯБРЯ ЖАБА ПОРАБОЩАЕТ МОЙ АНУС ААААА
hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от Mischutka

Теоретически Ada (точнее SPARK 2014) может заменить вообще всё, но есть несколько косяков:

  • Ada has no libs!
  • Ada - проприетарщина с двойным лицензированием.
  • У Ada фимозное илитистское сообщество.
shkolnick-kun ★★★★★
()
Ответ на: комментарий от Stanson

Хорош изворачиваться!

Ты не читал докумнтацию на open и обосралься.

Кстати, на кой хрен у тебя используются одновременно unistd.h и stdio.h?

Причем есть вызовы функций файлового ввода-вывода из обоих заголовков.

Ты копипастой программируешь чтоле?

З.Ы. Если бы ты по всему файлу использовал fopen, fread, fclose, то никакого обсёра бы не было (во всяком случае с памятью), т.к. fopen работает ровно так, как ты думал, когда писал

    ret = read( fd, buf, sizeof(buf) - 1 );
    close( fd );

    buf[ret] = 0;
shkolnick-kun ★★★★★
()
Последнее исправление: shkolnick-kun (всего исправлений: 1)
Ответ на: комментарий от shkolnick-kun

Ada - проприетарщина с двойным лицензированием.

А можно подробнее?

У Ada фимозное илитистское сообщество.

В сравнении с сишным-то? Особенно в этом треде? Потому что Stanson вообще не уникален в своём безумии среди сишников. Я таких довольно много видел, в том числе среди преподавателей программирования в универах.

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

Эдак выйдет, что и C, и C++, и Фортран - проприетарщина! Ведь есть пропиетарные компиляторы.

gag ★★★★★
()
Ответ на: комментарий от shkolnick-kun

always way behind

Это насколько? Даже фичи из ещё не вышедшего стандарта 2022 есть.

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

код тупо навернётся если ему директорию подсунуть вместо файла.

А если дорожки на плате замкнуть, то что будет? :)

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

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

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

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

Мне кажется, скорее ты неправильно сделан. И аналогии у тебя неправильные. В твоей вселенной с автомобилями, твой софт выглядел бы как автомобиль, у которого отваливаются колёса, если на сидение вместо пассажира положить мешок картошки.

К слову, недавняя дыра в Polkit примерно вот так же появилась. Что? Argc? Зачем нам проверять входные параметры? Упадёт и похер! Софт не для дебилов! Ололололо! Кому нужна эта безопасность?!!!

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

Хорош изворачиваться!

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

Ты не читал докумнтацию на open и обосралься.

C open у меня всё в порядочке. И имеющая смысл ошибка обрабатывается.

Кстати, на кой хрен у тебя используются одновременно unistd.h и stdio.h?

stdio.h там потому что printf / fprintf. Внезапно.

Ты копипастой программируешь чтоле?

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

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

И аналогии у тебя неправильные.

Конечно. Правильные аналогии могут быть только у вас. А очередь на еженедельное анальное зондирование надо занимать с вечера. Ради безопасности.

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

А это вообще что, и нахрена может быть нужно? Какое-нибудь очередное хипстерское поделие?

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

А очередь на еженедельное анальное зондирование надо занимать с вечера. Ради безопасности.

Никогда не ходил на анальное зондирование. Тебе лучше знать, видимо.

А это вообще что, и нахрена может быть нужно? Какое-нибудь очередное хипстерское поделие?

Не, это суровые сишные говнокодеры из редхата написали. Такие же как ты :D

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

К слову, недавняя дыра в Polkit примерно вот так же появилась. Что? Argc? Зачем нам проверять входные параметры? Упадёт и похер! Софт не для дебилов! Ололололо! Кому нужна эта безопасность?!!!

Вот тут, как раз, все хороши. В argv ведь должен же быть в первом аргументе имя бинарника (собственно, первый аргумент), а argc > 0. Ведь должен-же, да. Договаривались же. Половина example-ов так написана.

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

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

Никогда не ходил на анальное зондирование.

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

Не, это суровые сишные говнокодеры из редхата написали. Такие же как ты :D

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

Даже тут у вас никакой логики нет.

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

Даже тут у вас никакой логики нет.

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

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

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

О какой безопасности ты говоришь вообще? Тебе уже 100 раз сказали: в твоём коде ошибка. Потому что ты говнокодер и не умеешь на C программировать.

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

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

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

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

:)

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

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

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

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

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

Ну перестань. Что угодно можно сделать, но только не UB.

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

вас не устроили мои объяснения на предмет того

Прежде чем говорить о том, устроили или нет, а так же для того, чтобы предметно обсуждать что вы могли бы сделать в ситуации, когда open успешен, а read – нет, мне нужно убедиться, что вашим объяснениям можно доверять.

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

Поэтому прощу просто ответить на вопрос могу ли я всерьез рассматривать вот эти ваши слова:

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

?

Пожалуйста, «да» или «нет».

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

могу ли я всерьез рассматривать вот эти ваши слова:

Вы вообще, что-ли не в состоянии задавать осмысленные вопросы? Откуда и как я должен узнать, что вы там можете делать всерьёз, а что не можете? Я не телепат, увы.

Чо-то вообще какая-то беда с мозгами у секты верующих в «безопасность». Напрочь. Вот что вообще может быть непонятно в написанном?

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

При этом, что интересно, ни у кого из любителей «безопасного» «программирования», не возникло вообще никаких вопросов про то, что в той же самой функции нет ни проверки не возвращает ли snprintf() ошибку, ни проверки ошибок функций libstrophe, ни проверки что возвращает close(), gettimeofday() и т.д. За несколько дней - ни у кого никаких вопросов вообще. Странно, правда? А как же «безопасность»? :)

Клоуны, блин. Натруально анскильные кривляющиеся клоуны. :)

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

Откуда и как я должен узнать, что вы там можете делать всерьёз, а что не можете?

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

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

Итак, перейдем к сути.

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

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

Т.е. решить это нужно было уже на стадии проектирования, еще до написания кода. И если бы это было решено, то вам бы не пришлось заявлять (ключевое выделено) «Я вот не знаю. Снова пытаться открыть и прочитать? Сколько раз это надо делать? Или оставить его нетронутым, вдруг, через пару лет при запуске демона при перезагрузке машины этот файл прочитается и отошлётся сообщив получателю то, что его уже два года не волнует?»

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

Ну да ладно, допустим, у вас такая обработка, которая не может поломаться ну вот вообще никогда, ну вот вообще.

И единственная потенциально проблемная ситуация, с которой теоретически можно столкнуться – это неуспешный read после успешного open.

Ok. Пусть так.

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

В таком случае очевидный выход – это тупо позвать abort после неудачного read. Возможно, с предварительной руганью в stderr.

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

И этот вариант гораздо (просто на несколько порядков) лучше, чем UB в коде.

Чо-то вообще какая-то беда с мозгами у секты верующих в безопасность.

Если что, то у меня основной язык – это C++, он небезопаснее вашей любимой ламповой Сишечки. Но меня заботят такие вещи, как корректность и предсказуемость.

Ну и да, в C++ нет проблем с закрытием файла при преждевременном return-е. По крайней мере, если это код на нормальном C++, а не продукт жизнедейтельности упорышей с сишным бэкграундом.

Вот что вообще может быть непонятно в написанном?

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

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

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

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

Вот я и не выдумывал.

Что-нибудь про risk management слышали?

В таком случае очевидный выход – это тупо позвать abort после неудачного read.

Одна такая хрень крутится у меня на подвальном серваке. В том числе её задача - отправлять мне сообщения в жаббер, если вдруг датчик летучих углеводородов на первом этаже унюхает пропан-бутан. При замене баллона, например, оно успешно рапортует о том, что газом завоняло. Допустим, что именно в этот момент замены баллона (ну а фигли, фантазировать, так фантазировать) случается это самое крайне маловероятное событие, происходит та самая ошибка и демон кончается по abort(). Через пару дней, когда я где-нибудь по делам мотаюсь, отключают электричество, упс выедает батарейки, а запустить генератор некому. Электричество включают, сервак поднимается, запускает фитюльку, которая внезапно обнаруживает сообщение которое надо отправить. Я получаю сообщение, что у меня утечка газа, бросаю свои дела и еду домой. А по приезду оказывается, что это так и надо, так и должно быть, главное ведь это «безопасное» «программирование», а не какие-то там задачи дурацкие, дела и всё такое.

Возможно, с предварительной руганью в stderr.

Основной режим работы фитюльки - демон, тащемта, у него stderr нету. :)

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

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

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

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

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

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

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

Вот я и не выдумывал.

Оно заметно.

Что-нибудь про risk management слышали?

Вы, очевидно, нет.

Допустим, что именно в этот момент замены баллона (ну а фигли, фантазировать, так фантазировать) случается это самое крайне маловероятное событие, происходит та самая ошибка и демон кончается по abort().

И ваш упавший демон перезапускают. Тут же.

Основной режим работы фитюльки - демон, тащемта, у него stderr нету. :)

Ok, вы не знаете, как запустить софтину с выхлопом в stdout/stderr в качестве демона с перенаправлением выхлопа в логи.

Не пишите в stderr. Просто вызовите abort.

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

Ага, нужно посадить в программу UB и надеяться на лучшее.

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

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

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

Ага, не находит там "To: " и проваливается до перемещения файла.

И ваш упавший демон перезапускают. Тут же.

Кто? Я всякими системдэ не пользуюсь. Упавшая софтина требует разбирательств, а не перезапуска. И эти люди что-то там про безопасность говорят?

Ok, вы не знаете, как запустить софтину с выхлопом в stdout/stderr в качестве демона с перенаправлением выхлопа в логи.

А зачем эти костыли, если сама софтина прекрасно умеет в syslog?

Ага, нужно посадить в программу UB и надеяться на лучшее.

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

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

А, так вы не только специалисты по безопасности, но ещё и медицинские диагнозы по чатегу ставите? Упс. Я и забыл, что пару лет назад это было всего лишь мемасиком. А теперь, вашими стараниями в сфере отношения к Святой Безопасности, медицинские диагнозы через чатег это суровая реальность этого клоунского мира. :)

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

Я, если честно не очень на предмет общения с аутистами, так что не распарсил.

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

Щас вроде spark в моде. Его даже nvidia себе взяла и критическую фирмварь на нем пишет.

По слухам, производительность такая же как у си.

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

read( fd, buf, sizeof(buf) - 1 );

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

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
~/Tests> cat csucks.c 
main()
{
        printf("C sucks!!!\n");
}
~/Tests> gcc csucks.c -o csucks
csucks.c:1:1: warning: return type defaults to 'int' [-Wimplicit-int]
    1 | main()
      | ^~~~
csucks.c: In function 'main':
csucks.c:3:9: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
    3 |         printf("C sucks!!!\n");
      |         ^~~~~~
csucks.c:1:1: note: include '<stdio.h>' or provide a declaration of 'printf'
  +++ |+#include <stdio.h>
    1 | main()
csucks.c:3:9: warning: incompatible implicit declaration of built-in function 'printf' [-Wbuiltin-declaration-mismatch]
    3 |         printf("C sucks!!!\n");
      |         ^~~~~~
csucks.c:3:9: note: include '<stdio.h>' or provide a declaration of 'printf'
~/Tests> csucks 
C sucks!!!
~/Tests> 

И никаких ошибок. В 2022 году.

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

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

А мне уродливым кажется пробел до скобки, например. Откуда пошло? да х.з. как-то само получилось. Чисто вкусовщина.

Да и какое это вообще может имееть значение при наличии indent? Не понравилось форматирование в чужих сырцах - натравил indent и всё стало хорошо.

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

А мне уродливым кажется пробел до скобки, например. Откуда пошло?

От есстественных правил пунктуации сотни лет назад как только вообще скобки появились.

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

Никогда об этом не думал с такой стороны, но как бы натягивать естественную пунктуацию на неестественный ЯП - не очень естественно.

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

Все правила те же и в ЯП: пробел до открывающийся скобки, после закрывающийся, пробел после запятой, пробел перед и после знака равенства и т.д.. Ничего особенного тут нет.

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

Вот вообще не возражаю ни разу. Как удобно - так и фигачьте. Если мне лично не понравится - у меня indent есть.

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

…Подбирая челюсть с пола.

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

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

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.