1. C++ / Говнокод #16631

    +61

    1. 1
    int len = dynamic_cast<GatewayRec *>(*Iter)->PrefixMatch(aliases, matchedalias, priority);

    gnugk

    Запостил: bormand, 02 Сентября 2014

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

    • А потом это собирается на 64битной платформе...

      А зачем им указатель в инте?
      Ответить
      • > А потом это собирается на 64битной платформе...
        ... и ничего не ломается.

        > А зачем им указатель в инте?
        А указатель не в инте. Инт - результат вызова PrefixMatch'а над результатом динамического каста.

        Тут подвох в другом ;)
        Ответить
        • В том, что указатель не проверяется после dynamic_cast?

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

          М-да. Крестопроблемы.
          Ответить
          • > М-да. Крестопроблемы.
            В чём крестопроблемы? В языке намеренно два вида каста. Ссылки не могутдолжны быть невалидными, поэтому dynamic_cast на них может сигнализировать об ошибке только исключением.

            Указатели могут быть nullptr, dynamic_cast для указателей возвращает nullptr. Есть даже специальная конструкция, полезная, когда ты не уверен в успешности даункаста:
            if (Derived *d = dynamic_cast<Derived *>(base)) {
                d->do_custom_stuff();
            }
            Ответить
            • > Ссылки не могутдолжны быть невалидными, поэтому dynamic_cast на них может сигнализировать об ошибке только исключением.

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

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

              Давайте тогда обычный new будет при нехватке памяти возвращать нулевой указатель, а new[] - кидать bad_alloc. Ну а что, разные операторы же!

              > Есть даже специальная конструкция, полезная, когда ты не уверен в успешности даункаста

              Костыльный закос под жабовский instanceof поверх костыльной технологии. И так в ваших крестах всё.
              Ответить
              • > бросать исключение. Всегда.

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

                > Костыльный закос под жабовский instanceof

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

                  RTTI (включая dynamic_cast) тоже отключают, и что? Ретрограды должны страдать. Либо уж и исключения, и RTTI, либо ни того, ни другого.

                  > Ну вообще-то dynamic_cast появился до рождения самой жабы и идея скорее заимствована из тайп-свича в Simula.

                  Не сам dynamic_cast, а вот такая идиома. Или она тоже до Жабы появилась?

                  > А жабий instanceof - ещё бОльшее убожество, там потом ещё один каст писать надо.

                  Тут согласна, компилятор мог бы и без каста догадаться, по одному instanceof. Кстати, компилятор Ceylon так и делает. Например, такой код скомпилируется:

                  Object obj = <...>;
                  
                  if (is Integer obj) {
                      print(obj + 1 < 42);
                  }
                  Ответить
                  • > RTTI (включая dynamic_cast)
                    СЕНСАЦИЯ! dynamic_cast можно использовать с отключенным RTTI.

                    > Или она тоже до Жабы появилась?
                    Весьма вероятно.
                    Ответить
                    • GCC позволяет, если может разрешить dynamic_cast на стадии компиляции. В общем случае - нет:

                      http://pastebin.com/3SRktZZR
                      Ответить
                      • > GCC позволяет, если может разрешить dynamic_cast на стадии компиляции

                        Я это и имел в виду.

                        А вообще суровые мужики пишут свой dynamic_cast, работающий за O(1), а не юзают стандартное тормозное говно.
                        Иногда нужно для реализации алгебраических типов данных, например.
                        Ответить
                        • После упоминания суровых мужиков диалог прервался.
                          Ответить
                          • А кстати, вот ещё разница есть: операторам кастов нужно всегда указатели проверять на null чтобы из нуля случайно не вычесть. А с сылками это делать не обязательно.
                            ПИРФОМАНС
                            Ответить
                          • боятся-с сурового сибирского мужика Борманда
                            Ответить
                            • Хватит лизать жопы, на тебя тут никто не польстится.
                              Ищи ебарей в другом месте.
                              Ответить
                              • Он забавный! Без него нам будет скучно.
                                Ответить
                • Задумался: а что происходит с ошибочным приведением ссылок при отсутствии исключений в реализации?
                  Ответить
                  • приложение допустило недопустимое?

                    так-то плохую ссылку сделать можно и без динамик-каста, приложение упадет при обращении к ней
                    http://ideone.com/jyWpwp
                    Ответить
                    • >упадет при обращении к ней
                      ещё бы. ведь адрес такой ссылки нулевой:
                      http://ideone.com/ME9Mhm
                      Ответить
                    • УМВР ЧЯНТД? http://ideone.com/MavDCH
                      Ответить
                      • а как же данные объекта потрогать?
                        http://ideone.com/OshNcu
                        Ответить
                  • std::terminate() по идее. В общем то же самое, что и если бы ты его не поймал.
                    Ответить
                    • угу. А поймать его не получится, т.к. с -fno_exceptions нельзя собрать с catch в коде.
                      Ответить
              • > Давайте тогда обычный new будет при нехватке памяти возвращать нулевой указатель, а new[] - кидать bad_alloc.

                А там, кстати, есть new, который возвращает нулевой указатель :)
                Ответить
                • > есть new, который возвращает нулевой указатель

                  ага, new (std::nothrow)
                  Ответить
                  • Про nothrow я знаю. Кстати, ничто не мешало ввести аналогичный синтаксис и для dynamic_cast:

                    dynamic_cast<Derived *>(base, std::nothrow)
                    Ответить
                    • емним, наличие ровно одного параметра в *_cast - политика партии
                      этим даже страдает boost::lexical_cast, их просили добавить опционально, например, указание локали, отказались
                      Ответить
              • Эксепшоны с РАИИ это большой геморрой. Минуснул, короче, тупое ньюфажедрочерство.
                Ответить
                • а эксепшоны без РАИИ это вообще путь в ад
                  Ответить
                  • В особенности с GC и динамической питуизацией.
                    Ответить
                  • Верно. Либо геморрой, либо путь в ад. Отлично!
                    Ответить
                    • хотя с геморроем в рай не пускают, а в аду еще тот геморрой...
                      Ответить
          • > подумала
            > Крестопроблемы
            O_o
            Ответить
            • http://govnokod.ru/8329
              Как карлсон прям
              Ответить
              • Не ушла значит.
                Да, не. Просто необычно это :)
                Ответить
                • http://www.youtube.com/watch?v=YX3iRjKj7C0&t=8m50s

                  C++ is a man's language. You have to have serious cohones to sling that code around. You taste the testosterone running through every line of that code.
                  Java is more ... estrogen like language.
                  ...
                  C++ programmer is a wild hunter that stabs a bore in a heart with a spear.
                  Ответить
          • > lucidfox
            Едические рога! Оно вернулось!
            Ответить
            • Практически все они возвращаются (особенно те кто громко хлюопал дверью в стиле: злые вы - я ухожу). #7736 например.
              Хотя Webkill [ненастоящий] таки вроде помер.
              Ответить
        • > Тут подвох в другом ;)
          непроверенный dynamic_cast?
          Ответить
    • Кто-то согнал ботов и минусует весёлые комменты, плюсуя занудные. Не надо так.
      Ответить
      • кто-то балуется на переменке
        не во все школы ещё завезли глушилки сотовой связи
        Ответить
        • На моей школе так и вовсе антенна мегафона стояла. Пока директора не привлекли за незаконную установку. Уровень связи потом долго еще к прежнему варианту вернуть не могли.
          Ответить

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