1. C# / Говнокод #14582

    +136

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    public static string CreateBrowserCacheExtension(object key)
    {
        //...Остальной код опущен для ясности
        return "Cache=" + Math.Abs(key.GetHashCode());
    }

    Legacy code из проекта над которым я работаю.
    Косяк в том, что GetHashCode() иногда возвращает значение, равное System.Int32.MinValue.
    А это в свою очередь приводит к OverflowException, в случае с Math.Abs(...);

    Запостил: pikowatt, 14 Февраля 2014

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

    • показать все, что скрытоЯ лабал твою мать на горбу твоего отца.
      Ответить
    • return "Cache=" + (uint)key.GetHashCode();
      Как-то так?
      Ответить
    • Напоминает баг с делением на -1
      Ответить
      • А что за баг? Я догадываюсь, что при делении на отрицательные числа разные платформы будут возвращать разный остаток (у кого-то он отрицательный, у кого-то — положительный), и что-то слышал про FDIV на первом Пентиуме, а про минус один ничего не помню.
        Ответить
        • http://habrahabr.ru/post/179543/‎

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

          Хотя это же не драйвер, это видеоподсистема.
          Ответить
          • Интересно.

            Кстати, http://habrahabr.ru/post/179543/‎/#comment_6233731
            Чем многозадачность OS/2 отличается от многозадачности Винды?
            Ответить
          • Эти индусы совсем ничему не учатся.
            Иногда мне кажется что checked exceptions не такое и зло.
            Нормальным людям они конечно мешают.
            Но как иначе-то заставить говнокодеров читать спеку, доки по методам и проверять edge & corner case?
            Ответить
            • Какое отношение checked exceptions имеют к runtime ошибкам? Насколько я помню, деление min_int на -1 относится к ним.
              Ответить
              • Math.abs имел бы в сигнатуре исключение. Пусть даже runtime.
                Ответить
                • Да ну? Деление на ноль и OutOfMemoryError в жабе есть в исключениях?
                  Ответить
                  • Как и в сишке в жабе вообще нет исключений по переполнению. Иногда это мешает. Лучше конечно было иметь возможность включать/отключать сиё.
                    >Деление на ноль
                    Thrown when an exceptional arithmetic condition has occurred. For example, an integer "divide by zero" throws an instance of this class.
                    http://docs.oracle.com/javase/7/docs/api/java/lang/ArithmeticException.html
                    Оно не checked.
                    Ответить
                    • >имел бы в сигнатуре исключение. Пусть даже runtime.
                      RuntimeException в сигнатуре не бывает, иначе во все места пришлось бы писать OutOfMemoryException & co.
                      Ответить
                      • > OutOfMemoryException
                        А его вообще можно обработать?
                        Ответить
                        • Нет такого исключения. Есть OutOfMemoryError. Отловить его можно (ловить можно всё, что Throwable), только не нужно. При непродуманной обработке исключений в многопоточном коде всё особенно грустно: воркер-треды могут дохнут от OOM, а основной тред может упорно продолжать заниматься ерундой, когда надо бы уже достойно умереть. У нас сейчас в проекте как раз такая проблема имеется.
                          Ответить
                      • >>RuntimeException в сигнатуре не бывает
                        ORLY?
                        Ответить
                        • А что, бывает? В любом случае, писать его абсолютно необязательно.
                          Ответить
                          • >> RuntimeException в сигнатуре не бывает
                            >>писать его абсолютно необязательно.
                            Это немного разные вещи. Я бы сказал даже противоречивые.
                            http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Integer.java#Integer.valueOf%28java.lang.String%29

                            Тем не менее их частенько пишут. Для документации - чтобы люди читали и корректно обрабатывали ошибки.
                            Ответить
                            • IllegalArgumentException это немножко другое, сечешь? Его бросает сам вызываемый код, а не среда.
                              Ответить
                              • >>RuntimeException в сигнатуре не бывает
                                >>IllegalArgumentException это немножко другое
                                class IllegalArgumentException extends RuntimeException
                                улавливаешь?
                                Ответить
                              • >>Его бросает сам вызываемый код, а не среда.
                                Какая среда? Сегодня пятница.

                                Чем т.н. среда (IDE?) отличается от вызываемого кода?
                                Ответить
            • >Иногда мне кажется что checked exceptions не такое и зло.
              В коде, работающем с сокетами, в сигнатуре стоит IOError или как его там. Как определить, какой именно подкласс кидается, чтобы различать ошибки?
              Ответить
    • Постили уже такое когда-то.
      Этот нюанс с Abs и в сырцах шарпа был проёбан.
      http://govnokod.ru/3117
      Если уж добавляете в свою жабу unsigned, то хоть используйте их. (Я о типе возврата Math.Abs)
      Ответить

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