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

    +139.3

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    if (errno==EINTR) while (errno==EINTR)
         {
                fseek(fr,loffset,SEEK_SET);
                fgets(line_buffer,len,fr);
    }

    sacc - система биллинга для squid

    Одной проверки на ошибку - видимо, недостаточно

    Запостил: fiss, 11 Ноября 2009

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

    • показать все, что скрытоРазницу между if и while понимаем?
      Ответить
    • Школьный недочёт... неинтересно
      Ответить
      • Кстати говоря gcc4 с флагом -O2 вообще игнорирует данный if, т.ч. итоговый код всё-равно нормальный))
        Ответить
        • А, ну, тогда, просто, скорее всего именно gcc4 как раз с флагом -O2 и компилировали
          Ответить
          • Почему это вдруг? Вообще-то gcc иногда вполне эффективно убирает код не несущий никакой смысловой нагрузки.

            Вообще вы меня удивляете, у gcc достаточно серьёзные алгоритмы оптимизации и было бы странно, если бы gcc не замечал двойной проверки на "(errno==EINTR)".
            Ответить
            • Да знаю я. Это шутка была, мол оправдание к коду, подстроен под компилятор, можно и писать такое
              Ответить
    • Кстати, а там после этого куска кода нет "else" случайно? :)
      Ответить
    • Да, я постер.

      Вообще то я не понимаю разговоров по поводу gcc.. да естественно компилятор не идиот - и оптимизирует как надо, вопрос в другом - как можно было такое вообще написать.. И так же понятно, что можно просто обойтись while в данном случае - первая проверка инварианта цикла даст требуемое поведение.
      Ответить
      • Таварисч. Читайте маны!
        errno у нас статическая глобальная переменная устанавливающаяся во время ошибки системных вызовов, и вызов fgets() внутри цикла каждый раз ее устанавливает заново. Смысл кода в том чтобы пытаться выполнить пока не пройдет без прерывание эта операция. Так как fgets() использует системные вызовы, если возниктет прерывание, мы получим errno==EINTR опять, и вынуждены будем повторить чтение с данного места файла.

        Я бы даже сказал что это код с повышенной надежностью... но чего-то слегка не хватает, наверное проверки результата fgets() на EOF...
        Ответить
        • ааааа
          сорьк
          фсе понял... посыпаю голову пеплом...

          я чет подумал что наезды по поводу того шо while лишний...
          а там if ненадо, ой ненадо

          аааааа! был невнимателен....
          Ответить

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