1. Си / Говнокод #17154

    +133

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    int size;
    
    size = EXPR;
    
    if (size > INT_MAX || size <= 0) {
        return NULL;
    }
    
    // ...

    Ндя. Семь лет уже. Теперь всё понятно...

    Запостил: bot, 23 Ноября 2014

    Комментарии (52) RSS

    • http://use.perl.org/use.perl.org/_Aristotle/journal/33448.html
      Ответить
    • > size > INT_MAX
      Вот всяко компилятор посмотрел на это условие как на говно, и выпилил его.
      Ответить
      • Поэтому они сделали size float.
        Ответить
        • Но ведь инт32 не войдет во флоат без потери точности!
          Ответить
          • Зато про деление на sizeof(char) не забыли.
            Ответить
    • А вообще, проверка переполнений - это одна из основных жоп сишки. Все процессоры переполнение нормально детектируют, но из-за сишного уровня абстракции эта инфа пропадает впустую :(
      Ответить
      • честно говоря, в жизненых ситуациях, еще не разу не натыкался на эти проблемы. на все операции есть какие-то ограничения.

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

        тот же calloc(). в доморощенной реализации 10+ лет назад я влепил по тупому ограничение 1МБ на размер аллоцируемого буффера. в конторе уже давно не работаю - а бывшие коллеги расказали что за эти годы, благодаря моей проверке, некоторое количество серьёзных багов споймали.
        Ответить
      • >>нормально детектируют
        это Вы про флажочек в FLAGS?:)))
        Ответить
        • А чем плох флажочек?
          Ответить
          • Позвольте, я блесну умищем.
            Флажочек плох тем, что его нужно проверять постоянно. Если не проверяем - получаем неверный результат в результате переполнения. Если проверяем - получаем уменьшение производительности.
            Это в нашем любимом x86.

            Но есть другие архитектуры процессоров. Например, в БК-0010 стоял проц, совместимый по системе команд с PDP-11. Так вот там при переполнении не только выставлялся флажок, но и происходило аппаратное прерывание: переход на подпрограмму по адресу, указанному в специальном векторе прерывания.
            Что это даёт? При отсутствии переполнения производительность не ухудшается ни на йоту! При наличии переполнения, если нам не нужно на него реагировать, просто пишем команду возврата из прерывания в подпрограмме: цена выполнения - два перехода, туда и обратно.
            Ответить
            • > просто пишем команду возврата из прерывания в подпрограмме
              Ага... Вот только в защищенном режиме получается довольно прикольный маршрут.

              А флажочек с хинтом для предсказателя переходов тоже ничуть не ухудшит производительность.
              Ответить
              • > Вот только в защищенном режиме получается довольно прикольный маршрут.
                Это уже не важно, ведь произошла критическая ошибка, на которую нужно реагировать, нормальный ход вычислений прерван.

                А флажочек с хинтом должне быть в архитектуре процессора. Если такого нет - упс.

                В целом согласен - варианты могут быть разные.
                Ответить
            • Ээх... Где этот БК сейчас?
              Ответить
    • Баян на самом деле, про это уже смеялись)

      А вот опять вопрос: неужели какой-нить линт на это не ругнулся?
      Ответить
      • Неужели кто-то гонял lint на исходниках пыхи?
        Ответить
        • В моем мире пони какают радугой, и программисты прогоняют юнит тесты и инспекторы вроде линта на CI сервере хотя бы раз в сутки.

          В Вашем -- нет?
          Ответить
          • Не знаю, я не пилил исходники пыхи. Но что-то мне намекает, что никто там никаких lint'ов не гонял.
            Ответить
            • Блин, у меня даже для джавы в IDE инспекции гоняются, а в сях ведь насрать себе на голову в тысячу раз проще! Как так можно?

              Ладно. Пусть с ним, с линтом. Ну а как можно всерьез написать if intVar > MAX_INT?
              Ответить
            • Даже если бы разработчики пыхи гоняли lint, они бы утверждали, что этот Warning ожидаем и это не баг.

              5.4.0 проваливала тесты, но была выпущена:
              http://www.reddit.com/comments/qeq7k/php_540_ships_with_82_failing_tests_in_t he_suite/
              Ответить
              • --Простите сэр, почему у Вашего релизного билда сорок варнингов и пять тестов упало
                --Это ожидаемые варнинги и ожидаемые падения
                --А, ок
                Ответить
                • Эти тесты написали идиоты. Правильно написанные тесты не падают
                  Ответить

                  • Тесты это маркетинговый интерпрайз буллщит. Я 20 лет пишут без тестов и всё в порядке
                    Ответить
                    • Тесты? Какие еще тесты? Некогда мне, код писать надо.
                      Ответить
                      • В моём коде не бывает ошибок, я же опытный программист. Зачем мне тесты?
                        Ответить
                        • А ведь и правда, зачем?
                          Ответить

                          • Незачем совершенно. Вообще всё начиная со структурного программирования Дейкстры 70х и заканчивая async'ами нашего времени -- все это не нужно.

                            Люди отлично писали на Коболе в 1960м, и всё у них работало.

                            А сейчас XP, ООП, Agile, BDD, TDD, ужас!
                            Ответить
                            • Но ведь тесты не покрывают все вероятности ошибок в программе. Это физически невозможно. Кажется нашлась ещё одна ниша
                              Смысл современного тестирования - это взгляд на мир сквозь розовые очки. Если передаём true, то должно вернуть false. Смешно же. А если передадут нул, или, не дай Бог, структуру какую-нибудь?..
                              Получается, что вероятность наступления капута, какому-нибудь, самолёту, повышается, если вдруг в закрылки ударит ветер с силой и под углом, значения которых не предуматривались в этом самом тестировании...

                              Автор комментария был навечно забанен за еретическое неприятие юнит-и-прочих-модульных-тестов. Страйкер: 2014-11-24T20:49:34
                              Ответить
                              • Это судьба любого эмпирически полученого знания. Можно с уверенностью знать только то, что что-то наверняка не может быть правильным. Точно так же, тесты подтверждают что каких-то ошибок не случится, за то, что не случится никаких ошибок ни при каких обстоятельствах ни один вменяемый человек не подпишется.
                                Ответить
                              • Ну да.
                                Или вот например некоторые говорят: используйте статическую типизацию. Это, дескать, помогает отлавливать ошибки, писать и читать код. Но ведь все ошибки всё равно не отловишь, а код писать всё равно надо с умом. Потому я в java и C# программах всегда использую Object или Map/Dictionary, а в языках вроде Python тоже dict: сложил, и на месте разобрался.

                                Или вот например недавно все помешались на MVC и его производиных. Хотят, видите-ли, разделать модель, поведение и вью. Какая чушь!

                                Вот тут серьезный программист объективно объяснил что это не нужно: https://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html


                                Автор приглашен на конферению в качестве докладчика по теме "современный подход к разработке ПО"
                                Ответить
                                • PS. Этот сайт меня банит - и не открывается... Мне кажется, или Анонимуса поломали на досуге... После знаменательной публикации >9Мб паролей
                                  Ответить
                                  • Попробуйте снова. Ну или погуглите по названию.


                                    Анонимус неломаем.
                                    Ответить
                                    • У меня открывается только после F5 и почему-то без CSS. Вероятно, там какая-то хитрая защита от перегрузки сервера или этот сайт не понравился Милонову.

                                      А вот так работает: https://archive.today/hXEiI
                                      Ответить
                                      • Ну вот отличный же сайт!
                                        Видели там файл add.html?

                                        Он прекрасен же!
                                        Ответить
                                        • Мне понравилось. Только я бы ещё роутер прикрутил, чтобы скрыть расширения файлов и сделать настраиваемые URL.
                                          Ответить
                                          • Ну так .htaccess же есть)

                                            Кроме того роутер не решает всех проблем, а раз так -- значит не нужен.
                                            Ответить
                                            • HTML тоже не решает всех проблем, значит, не нужен.
                                              Ответить
                                              • Ну наконец-то Вы поняли!
                                                И фреймворки не нужны, и ОРМ не нужны, и MVC не нужно, и IDE не нужны, и тесты не нужны -- ничего не нужно, на самом деле! Потому что ничего из этого не решает всех проблем!
                                                Ответить
                                                • И вообще ЭВМ предназначены для решения проблем, которые они же и создают.
                                                  Ответить
                                                  • И как-то жили наши предки тысячи лет без ЭВМ, и ничего
                                                    Ответить
                                                    • Ну правда, что ещё совсем недавно делали люди после работы? Читали книги, интеллектуально развивались. А сейчас? Вместо интеллектуального развития переустанавливают Шиндошз, потому что Шиндошз сам себя не переставит, переставь Шиндошз ещё раз!
                                                      Ответить
                                                      • Во во! 20 лет назад бывалыча иду домой, а на скамеечке у дома мужички сидят, и книжку читают. Одну на троих. Иной раз и я сяду, да прочту с ними пару страничек.

                                                        А теперь я сразу домой и windows переставлять до утра. В некоторые дни мне за ночь удается семь раз ее переставить, родимую.
                                                        Ответить
                                                • А ведь дело не в решении всех проблем. Дело в том, что современность стремится к O(n²) семимильными шагами, сама того не замечая.
                                                  Ответить
                                        • > Видели там файл add.html?
                                          Возможно вы имели ввиду add.php?
                                          
                                          Error!: SQLSTATE[HY000]: General error: 11 database disk image is malformed
                                          fatal_error(array (
                                            0 => 'SQLSTATE[HY000]: General error: 11 database disk image is malformed',
                                          )) at /local/Web/sites/talks.php.net/presentations/slides/mvc/example/model/items.inc:65
                                          load(array (
                                          )) at /local/Web/sites/talks.php.net/presentations/slides/mvc/example/add_c.inc:43
                                          include(array (
                                            0 => '/local/Web/sites/talks.php.net/presentations/slides/mvc/example/add_c.inc',
                                          )) at /local/Web/sites/talks.php.net/presentations/slides/mvc/example/add.php:3
                                          
                                          Ответить
                                          • Это свидетельствует о том, что автор — серьёзный программист. Какой-нибудь говнокодер заткнул бы всё собаками.
                                            Ответить
                                        • > add.html
                                          У нас где-то в недрах старого сайта тоже валяются активные "хтмлки" на пёрле...
                                          Ответить
                                    • Кстати, а ведь что интересно: MVC, как показала практика, довольно таки недостаточна. (Только стоит отметить, что как пинок поз зад - вполне себе.) Современному программисту требуется ещё, как минимум, пару-тройку сущностей для реализации понятных, переносимых и расширяемых проектов.
                                      Ответить
                                • > некоторые говорят: используйте статическую типизацию. Это, дескать, помогает отлавливать ошибки, писать и читать код.

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

                                  Но для вас, это, конечно, не аргумент, вам небось "и PyCharm всё подчёркивает".

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

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

    Добавить комментарий