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

    +51.8

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    if(p) {
         if (p->m_String[0] == 0) {
             strcpy("foo", p->m_String);
          }
          DrawText(hdc, p->m_String, strlen(p->m_String), &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    }

    и такие веселые куски попадаются в официальном примере написания плагинов на сайте Mozilla
    пруф линк - http://mxr.mozilla.org/seamonkey/source/modules/plugin/samples/npruntime/plugin.cpp - строка 750

    Запостил: Coach, 13 Ноября 2009

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

    • Объясни, здесь не все на С++ программируют.
      Ответить
    • (p->m_String[0] == 0)
      В Си используются нуль-завершенные строки (то есть конец строки обозначается нулевым байтом, а точный размер строки нигде не хранится).
      В данном случае мы имеем такую не очень явную проверку на то, что строка пустая.
      Всегда ваш, К.О.
      Ответить
      • "В данном случае мы имеем такую не очень явную проверку на то, что строка пустая."
        Ну и что, что проверка не явная, ну и что там могут быть дальше символы.
        Нам то до них что, если на нулевом символе строка прерывается.
        Ответить
    • помимо всего прочего по синтаксису strcpy копируется содержимое второго аргумента в содержимое первого, а тут как мы видим первый аргумент является константной строкой "foo", а из проверок выше становиться понятно что мы пытаемся присвоить пустую строку.
      Ответить
      • Спасибо, я хоть на C++ не программирую, но немного его знаю.
        Про strcpy заметил, но потом подумал, что я неправ.
        Ответить
      • А вообще кажется пример писали, даже не проверив.
        Ответить
        • пример даже собирается правда не без помощи напильника. я б на месте мозилы такое на оф сайте не выкладывал бы не проверив, но я не на их месте =)
          Ответить
        • ну почему-же, работать то будет без сбоев.
          Ответить
      • константа? я вас умоляю, в strcpy передастся указатель и ничто не помешает ему сработать.
        Ответить
        • правда, сюрприз ожидает если-б не было проверки на нулевую длину. :) :) :) :)
          Ответить
    • Ну ошибся человек, перепутал местами аргументы, бывает... :)
      Работать то всё равно будет. Указатель перед обращением проверен.
      Проверка на пустую строку верная.
      Ответить
      • // другой guest
        Смысл примера, насколько я понял, был вывести строку p, если она непустая, иначе вывести "foo". Из-за неправильно использования strcpy "иначе" просто не сработает. Так что я бы не стал говорить, что проверка верная. А код я бы предпочёл написать без strcpy:

        if (p){
        const char * s = "foo";
        if (p->m_String[0] != '\0')
        s = p->m_String;
        DrawText(hdc, s, strlen(s), ...);
        }
        Ответить
    • != 0 меня тоже прикалывает. Из серии != false.
      if (p->m_String[0]) тогда уж.
      Ответить
      • Зато наглядно. Подробные коменты в коде тебя не прикалывают, случаем?
        Ответить
    • а ничего что такая проверка будет выполняться быстрее, чем считать длину всей строки...
      Ответить
      • А ничего, что, учитывая некоторую неторопливость XULRunner (всё же интерпретатор), такая разница в скорости будет не слишком критична?
        Ответить
        • если в проэкте весь код говно, это еще не повод писать новый модуль тоже говнокодом.
          Ответить
          • Как вы заманали. У меня у самого постоянно проблемы с русским языком, но прошу вас, хватит уже писать "проЭкт" вместо "проект"!
            Ответить
            • >хватит уже писать "проЭкт"
              Теперь будем писать "проЁкт".
              Ответить

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