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

    +109

    1. 1
    memcpy (stderr, stdout, sizeof (FILE));

    Запостил: gpr, 06 Февраля 2015

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

    • хех. типа перенаправления потоков, но не совсем. с порчей stdout'а.
      Ответить
      • Если я верно понял, в результате перенаправили stdout в stderr?
        Ответить
        • > перенаправили stdout в stderr?
          переписали потроха stdout в stderr. Что привело к перенаправлению stderr в stdout.
          Ответить
      • Наоборот же.
        Бля, я уже знаю без подсказки сигнатуру memcpy, мне пиздец походу, доктора звать поздно.
        Ответить
        • пшла
          Ответить
        • > я уже знаю без подсказки сигнатуру memcpy

          А чего тут знать-то...
          Легко запомнить: представляешь, какую сигнатуру сделал бы любой вменяемый человек, изменяешь в этой сигнатуре порядок dest/source, получаешь сигнатуру memcpy.
          Ответить
          • > изменяешь в этой сигнатуре порядок
            уже как-то обсуждалось тут оное.
            порядок в memcpy аналогичен порядку в обычном присваивании: dst = src; так что всё вменяемо и логично.
            Ответить
            • > всё вменяемо и логично.
              И именно поэтому ты ошибся в первом комменте.
              Ответить
              • >И именно поэтому ты ошибся в первом комменте.
                Я не ошибся. Перестает работать именно с stdout. Хотя с него только чтение идет в memcpy.
                http://ideone.com/Phd7IG
                Ответить
                • Я не врубаюсь, почему от того, что его данные куда-то скопировали, он перестал работать?
                  Ответить
                  • У них появляется шареный буфер, который они дружно портят. Как именно - я пока не понял. Если буферизацию отключить, всё работает.
                    http://ideone.com/BNg585
                    Ответить
                • Меня смущает sizeof(FILE). У stderr/stdout тип FILE*...
                  Ответить
                  • > Меня смущает sizeof(FILE). У stderr/stdout тип FILE*...
                    там мы же пишем stderr в memcpy, а не &stderr. Поэтому третий аргумент как раз размер сущности, адрес которой есть первый (второй) аргумент.
                    Ответить
                    • Ой, туплю... Странно, что FILE не сделали opaque pointer. Негоже пользователям кишки показывать.
                      Ответить
                      • Типа HFILE и константу INVALID_FILE?
                        Так не сделали потому, что это не винапи блядь, это кроссплатформенная сишколиба.
                        Ответить
                        • > это кроссплатформенная сишколиба
                          И что? Во многих кроссплатформенных сишколибах наружу торчат только всякие hui_t да djigurda_t. Это только увеличивает их кроссплатформенность.
                          Ответить
                          • Ах Борманд, тонкий шутник, заметил, что pizda_t торчать не может
                            Ответить
        • Wer mit ungeheuer kämpft, mag zusehn, dass er nicht dabei zum ungeheuer wird.
          Ungeheuern созвучно с überqueren И не только "монстр" но чудовищный, ужасающий, неимоверный, громадный, прям как С++
          Ответить
    • dup2(1, 2);
      не?
      Ответить
      • На винде не заработает, а так да
        Ответить
    • Спасибо что не из /dev/null копируешь, анонимус
      Ответить
    • а еще есть и ошибка копирования, если блоки частично перекрываются :)
      Ответить

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