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

    +133

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    public Normalizer(Int32 totalElementsCount)
    {
        _totalElementsCount = totalElementsCount;
        _delta = Int32.MaxValue / (2 * totalElementsCount);
        if (_delta == 0)
            throw new OverflowException("Too much normalizated records.");
    }

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

    Запостил: botinko, 05 Декабря 2013

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

    • Да тут не только в totalElementsCount дело. Тут всё пахнет сильно.
      Ответить
      • Я не знаю C#, но что-то мне подсказывает, что 2 * totalElementsCount будет автоматически приведено к Int32, что вызовет в половине случаев ошибку переполнения. Ещё и _delta с _totalElementsCount определены непонятно где. Ещё и исключение до кучи. Что мешало написать как ниже?

        public bool checkUrAnus(Int32 holeRadius)
        {
            return holeRadius < Int32.MaxValue / 2;
        }
        Ответить
        • Да, оно будет Int32. Так что 0 никогда не получится. Оно упадёт с OverflowException (правда, там в if'е оно же, так что не очень страшно), если где-нибудь не присобачено unchecked.
          Ответить
        • Имхо, пофиксить переполнение можно как-то так:
          public Normalizer(Int32 totalElementsCount)
          {
              _totalElementsCount = totalElementsCount;
              _delta = Int32.MaxValue / 2 / totalElementsCount;
              if (_delta == 0)
                  throw new OverflowException("Too many normalized records.");
          }
          > _delta с _totalElementsCount определены непонятно где
          Члены класса же. 99%, что здесь мы видим его конструктор.

          > Ещё и исключение до кучи.
          > return
          В какой версии c# научился возвращать значения из конструкторов? :)
          Ответить
    • author here
      Да, тут не хватает буквы L после 2.
      Но с тем же успехом можно постить код с http://referencesource.microsoft.com/ , у них также бывают такие ошибки. Например, в System.Random.
      Кроме того, готов поспорить, код кто-то "рефакторил" после того как я это написал в 2008, возможно и L грохнули. Помнится, там был дурацкий модный тогда UpperCamelCase. И, возможно, матерные комментарии.
      Но я гарантирую: это 5 строчек кода продуманы лучше, чем любые пять последовательных строк в вашем фронтенде.
      DBZE там запроектирован: класс реализует нормализацию иерархии, которая невозможна для нуля элементов ввиду... вы удивитесь... невозможности делить на ноль.
      Более чем уверен, что вы столкнулись с DBZE написав бесполезный тест, который нарушает контракт нормализатора, абсолютно не понимая что это за нормализатор такой. "Нашли баг в говнокоде!"

      Меня это конечно мало волнует, но Юрий поинтересовался мнением руководства перед тем, как постить зарегистрированный проприетарный код?

      Если вы и правда на столько круты, что готовы дебажить индексы, я могу на вскидку назвать пару реальных задач.
      Ответить
      • я просмотрел ваш зарегистрированный проприетарный код 1 раз
        скажите, можно ли его развидеть обратно, и если нет, то куда можно занести деньги?
        Ответить
        • Все проще ;) Нам всем придется заключить NDA с их конторой.
          Ответить
          • учитывая, что это C#, придется купить ещё и CAL
            Ответить
            • У меня кал ассоциируется только с лицензиями на доступ к виндовым серверами. Или это другой CAL?
              Ответить
              • тот самый
                "и да, конечно, при выборе IIS в качестве веб-сервера, вам придется купить CAL на каждого интернет-пользователя, который будет к нему обращаться и открывать страницы" ((c) официальный представитель микрософт)
                Ответить
                • > купить CAL на каждого интернет-пользователя
                  Да тогда проще и дешевле купить ядерную лицензию и забыть о кале, как о страшном сне :)
                  Ответить
                  • ты путаешь лицензирование оракла (named users OR core/socket) и лицензирование шиндошс сервер - cpu core AND CAL.

                    где в ядерную лицуху и так входит, не буду врать, около 2 CAL
                    просто CAL не нужны для IIS - банальный развод на бабло или неграмотный менеджер,
                    CAL нужны, если юзеры собираются под своими виндозными логинами и паролями лезть на сервер
                    Ответить
                    • А для аутентификации на сервере с помощью учётки Live, используя OAuth2, случайно у Микрософта никаких лицензий покупать не нужно?
                      Ответить
                      • Ну раз в Oauth участвуют джва сервера, то нужно джва CAL'а - один на доступ к серверу майкрософта, второй на доступ к нужному тебе сайту.
                        Ответить
        • BitCoin: 1KeBs4HBQzkdHC2ou3gpyGHqcL7aKzwTve
          LiteCoin: LiYp3Dg11N5BgV8qKW42ubSZXFmjDByjoV
          Ответить
          • Эм, так движок The Pirate Bay написан русскими программистами на шарпе? :)
            Ответить
    • код до рефакторинга:

      public Normalizer(int TotalElementsCount)
      {
          _totalElementsCount = TotalElementsCount;
           _delta = int.MaxValue/(2*TotalElementsCount);
          if (_delta == 0)
              throw new OverflowException("Too much normalizated records.");
          //миллиард - это примерно дохуя
          //а для классификатор, миллиард - это дохуя факториал
      }
      Ответить
      • Ок, L после двойки не было. Не самый критичный, но баг, да.
        Для чего нужна нормализация разобрались?
        Ответить
      • > much ... records
        записи они же исчисляемые
        Ответить
        • Ну если уж хочется докопаться до слов, то и normalizated стоит упомянуть.
          Ответить
          • блин, а слона-то я и не примейтил
            НормаЛизайтен! Шнелле, Шнелле!
            Ответить
    • - Спасибо, что подумала обо мне. И я не каждому отдам такую замечательную маму.
      Ответить

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