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

    +169

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    int mr_word_compare(const char* r1, int s1, const char* r2, int s2)
    {
       char* p1 = (char*)r1;
       char* p2 = (char*)r2;
       while (*p1 != ' ')
          ++ p1;
       *p1 = '\0';
       while (*p2 != ' ')
          ++ p2;
       *p2 = '\0';
    
       int res = strcmp(r1, r2);
       *p1 = ' ';
       *p2 = ' ';
    
       return res;
    }

    Запостил: vayerx, 24 Августа 2010

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

    • ы, конст чар меняют
      бедный компилятор

      кстати, а где тут с++?
      Ответить
      • > кстати, а где тут с++?

        В С по умолчанию строковые литералы не есть конст. В С++ литералы - всегда конст.

        вызов функции `mr_word_compare("hello ", "hello ")` в классическом С будет работать - а в С++ сразу повалится на записе нулей в строки.

        НО. почти все современные С компиляторы литералы тоже делают рид-онли - не смотря на то что их тип в С остался "char *" а не как в С++ "const char *".

        т.е. фактически здесь С++ нету....
        Ответить
    • > а где тут с++?
      Не начинай...
      Я вот жду, когда автор придет и скажет "тут им пришлось const char* в аргументе объявить, потому что передают строку в виде "блабла"... ". Только вдумайтесь. Но, раз я это придумал раньше, чем vayerx, то
      vayerx, что ты имел ввиду?
      Так, ну игнор s1 и s2 я увидел не сразу, но комплятор должен много пиздеть насчет этого.Насчет того, что человек не в теме за указатели это понятно. Всё?
      Ответить
      • проверка показала, что компилер даже намёка не делает, и доступ к участку памяти осуществляется;

        компилер: Ембаркадеро Рад студия С++ 10 (консоль(С и С++), без вцл)
        Ответить
        • Но моя ракета взлетала тысячи раз, почему же она упала? Что сделать? Какой malloc? (c)
          Ответить
          • ну, гавнецом тут очень сильно заваняет, если в строке нету пробелов...

            зы: зачем придумывалась эта функция даже знать не хочется, она практически не имеет смысла (либо крайне специфический: сравнение строк по первому слову в строке)

            а так - наглядно показано, что спецификатор конст - можно обойти;
            Ответить
            • >спецификатор конст - можно обойти;
              В плюсах много чего можно, если ЯВНО постараться.
              Защита же в большей степени сделана для исключения неявных ошибок.
              Ответить
      • за c++ - да, на автомате поставил - код из плюсового проекта.
        все найденные втфы:
        1. двухкратный проход по строкам
        2. собственная реализация без strcmp была бы короче
        и, как уже писали:
        3. запись в константные строки
        4. неиспользование s1,s2 - длин буферов.
        не говоря об интуитивно понятных идентификаторах
        Ответить
    • Кстати, насчёт "а где тут с++?" Т.к большинство говнокода можно отнести и туда и туда, может объединить разделы С и С++ ?
      Ответить
      • Ай, извините. Это уже есть в предложениях.
        Ответить
      • Не надо так делать.
        Я например не большой спец в плюсах, и некоторые шутки могу не понять. А С понимаю.
        Все таки это разные языки.
        Ответить
    • странно, что ещё static_cast тут не встретилось
      Ответить

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