Навеяло несколькими прочитанными недавно статьями и комментариями к ним.

Люди, помните - "дерьмо случается"! Конечно, хорошо жить в мире где всё идет строго по плану, работает без ошибок и сбоев, никто не пытается ни в чем навредить и так далее - от только где он, этот мир?

Вот недавнее: джава-скрипты в браузере сожрали кучу памяти, потому что где-то на роутере пакеты не проходили так, как от них ожидалось.
Хорошо, конечно, что причину удалось найти — но как вообще могло такое получиться?
Что, если между браузером и сайтом будет 100 500 узлов, 13 стран, и пара ТСПУ, на которых кто‑то решит бороться с мошенниками, делая обрезание каждому 6 пакету?
Гарантий — никаких. Как вообще может существовать софт, точнее, как его могли написать программисты, которые «знали о возможном наступлении проблемы, но самонадеянно полагали ее избежать»?

Или вот пишет кто‑то программу, запрашивает память — немного, всего пару сотен мегабайт — подумаешь, ведь у него на машине 64 гигабайта!
А что, если память не выделилась? И ведь это можно проверить прямо там, в коде — «а зачем?» ©

Но вот у кого‑то браузер как раз сожрал всю память, залез в своп и сожрал его тоже, и теперь несчастная программа, попросив всего‑то жалкие 200 мегабайт памяти под буфер — получает NULL.
И тут же отважно лезет что‑то писать по этому адресу. Кто виноват? Конечно, зловредный NULL, давайте с ним бороться! Создадим новый язык программирования,в котором в NULL писать безопасно.

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

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

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

Или вот блоки питания: кто не слышал про «220В в розетке»?
А если их выпрямить и поставить сглаживающий конденсатор? На сколько вольт? На 250 хватит?
Но забывают что сеть всегда 3-фазная, и если где‑то в квартире всего одна фаза — значит где‑то в другой — вторая. Её, вторую, кто‑то закоротит на «нейтраль» — а на вашей появится 380В межфазного напряжения.
И вот пошла гореть аппаратура по квартирам... Солидные, большие компании делали, не DIY какой‑нибудь...

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

Комментарии (34)


  1. DartfoL
    24.01.2026 00:29

    На сколько вольт? На 250 хватит?

    Не хватит, амплитудное значение напряжения в розетке - 325 В (при 230 В номинальных)


    1. 420AmonRa
      24.01.2026 00:29

      Проверьте осциллографом. Вы удивитесь. Полная амплитуда намного больше.


      1. KbRadar
        24.01.2026 00:29

        Амплитуда - максимальное отклонение от среднего, не надо путать с "размахом". Да, сеть можно выпрямить с удвоением и будет 600+, но обычно так не делают.


        1. 420AmonRa
          24.01.2026 00:29

          Не от среднего, а от точки равновесия. И да, я имел ввиду размах. Ошибся.


    1. Tiriet
      24.01.2026 00:29

      поэтому кондеры на 250В можно пользоваться в католических сетях 110AC, а в православных- надо брать конедеры на 400V. и перед ними ставить еще цепь безопасности, разрядник там, с плавкой вставкой, или еще какой элемент, чтоб снизить вероятность смерти оборудования от случайно клинанувшего в соседней стене промышленного перфоратора. А я как-то выносил технику из офиса, у которого на этаже клинанул такой перфоратор- половина входных цепей погорела, компы, МФУшки, принтеры. Было забавно- весь этаж небольшого офисного здания- комнат двенадцать- выносили сгоревшее офисное железо, включая даже один холодильник.


      1. MaFrance351
        24.01.2026 00:29

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


  1. dyadyaSerezha
    24.01.2026 00:29

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

    Ха, привет ошибка 2000 года. Но мир как-то выжил.

    А что, если память не выделилась? И ведь это можно проверить прямо там, в коде — «а зачем?»

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

    Создадим новый язык программирования,в котором в NULL писать безопасно.

    Так уже создали - bash. Писать в /dev/null вполне себе безопасно. И главное, очень быстро. Прямо очень очень быстро)


    1. bbc_69
      24.01.2026 00:29

      Что вы имеете в виду под верхним уровнем? Если ОС, то у неё немного выбора: убить процесс или оставить. Тут ещё вопрос, кого убивать надо: кто последний, тот и папа или самого прожорливого. А если верхний уровень программы, так это база, как мне казалось, - централизованное управление памятью.

      Вообще, именно этот случай у меня вызывает протест. Работаешь на низком уровне - будь готов всё ссылки проверять. Или бери другой ЯП. А 64ГБ - просто оправдание своей лени.


      1. dyadyaSerezha
        24.01.2026 00:29

        Верхний уровень программы, конечно. Только это никакое не централизованное управление памятью, а централизованное управление исключениями. На верхнем уровне программы могут обрабатывать я все не обработанные ниже исключения, как то: нехватка памяти, доступ к не своему адресу (сюда же к null), исключение сына из детсада.

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


    1. Forthright
      24.01.2026 00:29

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


      1. dyadyaSerezha
        24.01.2026 00:29

        Что там потом было с этой ошибкой, это уже другая история. Я же про сам оригинал, так сказать. Не писали бы программы из расчёта на 5 лет, не было и вовсе никакой проблемы 2000 года.


  1. mixsture
    24.01.2026 00:29

    Как вообще может существовать софт, точнее, как его могли написать программисты, которые «знали о возможном наступлении проблемы, но самонадеянно полагали ее избежать»

    так весь мир разработки пляшет под time-to-market же. А хорошая валидация, обработка ошибок и безопасность - противоположна этому принципу. Вот и получается у нас 15 действий по цепочке с одним обработчиком ошибок "что-то пошло не так!", либо вообще без обработчиков. Собственно и покрытие тестами то - покрывает фичи, а вовсе не выход за граничные условия и отсутствие ресурсов. Так что мы такие случаи с текущим подходом не найдем никогда, кроме как случайно лбом.


    1. Femistoklov
      24.01.2026 00:29

      А хорошая валидация, обработка ошибок и безопасность

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


      1. Newbilius
        24.01.2026 00:29

        Потому что "Можно. А зачем?" (c)

        Но если серьёзно, в реальности то чем отличаются ребята с условно-бесконечными бюджетами? Там тоже time-to-market в топе требований. Ну и объективно, ни у кого в топе рынка не выходит "вусмерть забагованное до состояние неюзабельности". Ключевые задачи пользователей они как правило решают достаточно стабильно, чтоб пользоваться их софтом и тратить на него деньги.


        1. Femistoklov
          24.01.2026 00:29

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

          А как же вопрос репутации? Всякие "Приложение криво выглядит на смартфонах с небольшим размером экрана - это недопустимо для организации нашего уровня" или "Заказчик сообщил о примитивном баге - это позор для компании с нашим именем!"


          1. Annsky
            24.01.2026 00:29

            "пипл хавает" (с)


      1. Arioch
        24.01.2026 00:29

        Тут обратная связь.

        Именно потому у них бюджеты и безлимитные, что они не тратят деньги на разную ненужную (им) ерунду - "этим не занимаются" (с).


      1. vanxant
        24.01.2026 00:29

        Наличие бюджета само по себе никак не влияет на обработку ошибок.

        Потому что сначала всегда и везде пишут и отлаживают happy path, т.е. работу программы в штатном режиме. Т.е. чтобы она тупо выполняла свою задачу хотя бы в тепличных условиях. Без этого она как бы и не нужна совсем.

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


        1. Femistoklov
          24.01.2026 00:29

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

          Т.е. классическая "проблема 9 женщин". Наверняка должен быть "закон" имени какого-нибудь известного ПМ-а типа "качество ПО не зависит от бюджета организации".


    1. Format-X22
      24.01.2026 00:29

      Вот и получается у нас 15 действий по цепочке с одним обработчиком ошибок "что-то пошло не так!", либо вообще без обработчиков.

      Забавно, но когда-то именно это считалось причиной победы Linux. В других уже умерших коммерческих ОС облепляли всё на свете проверками на ошибки, тратили много времени и денег. А в Linux был kernel panic. Сейчас про это уже забыли.


      1. JBFW Автор
        24.01.2026 00:29

        В Линуксе в цепочке cat xx | grep ddd |awk | sed | tail | blaablaba каждая отдельная программа способна:
        1 - писать не только в stdout, но и в stderr
        2 - завершать своё исполнение с кодом ошибки

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

        Какой еще kernel panic и причем он тут?!


  1. 0xC0CAC01A
    24.01.2026 00:29

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


    1. duselguy
      24.01.2026 00:29

      Размер памяти в Хроме на десктопе в винде задавался параметром при его старте (не знаю, как сейчас). И я им пользовался (в сторону увеличения (для хранения больших таблиц в js)).


      1. 0xC0CAC01A
        24.01.2026 00:29

        Если Вы про -Sv, то почему-то это не помогает, появляются процессы/табы, кушающие больше позволенного


        1. duselguy
          24.01.2026 00:29

          У меня (и других пользователей) проблем не было, может потому, что браузер работал офлайн с одним табом.
          И это был SPA = мой код + datatables


  1. dmitryez
    24.01.2026 00:29

    о5 JS виноват, ух какой


  1. Arioch
    24.01.2026 00:29

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

    Ответ: только он и может существовать. Потому что программист должен сделать быстро и дешево. Или его уволят. Программист, который придёт к хозяину со словами "я хочу потратить на программу в 5 раз больше времени и вытащить из вашего кошелька в 5 раз больше зарплаты сегодня, потому что может быть где-то в Сомали через пару лет кто-то обкурится и начнёт отстреливать каждый шестой пакет" рисует себе на спине большую такую мишень. Сегодня рисует, а не через 5 лет.

    Если вам интереснее подробнее и с примерами - просто прочитайте "The rise of worser is better"


  1. cs0ip
    24.01.2026 00:29

    А что за ?? я вижу в последнее время везде на хабре?


    1. JBFW Автор
      24.01.2026 00:29

      Оно обязательно сломается: не «если», а «когда»

      Где? )

      У меня всё работает (с) (тм)


      1. cs0ip
        24.01.2026 00:29

        У меня иногда всё ок, а иногда вот эти вопросы появляются. Это явно не к статье вопрос. Возможно где-то на фронте периодически бьется UTF-8


        1. JBFW Автор
          24.01.2026 00:29

          Просто не замечал такого ни разу на этом сайте

          Так-то да, похоже на utf


  1. Daddy_Cool
    24.01.2026 00:29

    Что-то я не пойму.
    Даже ИИ при упоминания malloc СРАЗУ ЖЕ выдает
    arr = (int*)malloc(n*sizeof(int)); // Приведение типа к (int*)

    if (arr == NULL) { // Обязательная проверка на NULL

    printf("Не удалось выделить память\n");...

    А вообще-то статья является переформулировкой закона Мёрфи.
    «Если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет».
    https://old.mista.ru/merfy/index.html


  1. ALT0105
    24.01.2026 00:29

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

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


  1. OldFashionedEngineer
    24.01.2026 00:29

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