1. Куча / Говнокод #18015

    −288

    1. 1
    http://blogs.msdn.com/b/oldnewthing/archive/2010/09/17/10063629.aspx

    Что за хрень? С каких пор \ в виндовой консоли эксейпит кавычки? Эскейпящий символ же ^?

    Запостил: 3_14dar, 17 Апреля 2015

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

    • с релиза
      Ответить
      • А как же крышка? Что за ебанутость - иметь 2 эксейпящих символа?
        Ответить
    • Сём, ты чё программированием-то вдруг заинтересовался? Вайп и срачи интереснее же.
      Ответить
    • ^ - в виндовой сосноли символ, указывающий компилятору на целостность строки.
      run ololololo^
      lolololo.exe
      Ответить
      • Што?
        Ответить
        • если ты напишешь ^ в конце строки, то интерпретатор проигнорирует знак переноса и воспримет

          ololololo
          lolololo.exe

          как ololololololololo.exe
          Ответить
          • Ну да, я об этом же - часть символов эскейпится крышкой, кавычки бекслешем, который по совместительству разделитель в пути, из-за чего у меня и вылезла проблема - параметр заканчивался на \". Нахуя весь этот цирк?
            Ответить
            • Выход один: просто не юзать batch. Переходи на vbs или AutoIt.
              Я намучался с консолью, когда учился писать примитивные трояны, и ещё в детстве зарёкся впредь иметь с ней дело.

              Глянь вот это: https://www.autoitscript.com/site/
              Синтаксис напоминает KIXTART, но возможности куда шире. Поддерживается компиляция скрипта в *.exe, можно интерфейс приделать - даже визуальный дизайнер форм есть, как в делфях. Вполне годный язык.
              Ответить
              • Там примитивный бат с подстановкой параметров в скрипт, и те же проблемы и без этого.
                Ответить
              • Это проблемы не консоли, а идиотского cmd.exe.

                Кстати, можно ещё писать на bash, на tcl (с библиотекой tk можно даже писать графические программы), на Перле, на Пухтоне, даже на JScript. Каких только извращений сейчас нет!
                Ответить
                • На PHP
                  Ответить
                  • Да!

                    Кстати:
                    https://ru.wikipedia.org/wiki/PHP-GTK
                    https://ru.wikipedia.org/wiki/PHP-Qt

                    Есть ещё обёртки для WinAPI.
                    Ответить
                • Это проблемы функции апи по ссылке
                  Ответить
                  • Я даже не знал, что такая функция есть... Всегда юзал PathGetArgs/PathRemoveArgs.
                    Ответить
                    • Ее юзает, например, путхон

                      >py -c "import sys;print sys.argv" "\"
                      ['-c', '"']
                      Ответить
                      • Тонко. Я тоже попробую ее поюзать.
                        Кстати, вышеупомянутые функции пишут в аргумент, что стало причиной многих багов у меня.
                        void PathRemoveArgs(
                          _Inout_  LPTSTR pszPath
                        );

                        Потом нашёл обёртку в JEDI, там на асме. Потом листнул справку, и понял, что нехорошо есть бананы вместе с кожурой:
                        function RemoveArgs(const path:string):string;
                        var
                           S:string;
                        begin
                           s:=path; // борландовские строки. Копия в памяти не создаётся, просто увеличивается счётчик ссылок.
                           UniqueString(s); // создаём копию строки.
                           PathRemoveArgs(pchar(s)); 
                           result:=s;
                        end;

                        Наверняка можно изящнее, но я устал.
                        Ответить
                        • >const path: string
                          >UniqueString

                          Ну охуеть теперь.
                          Ответить
                          • SysUtils.pas
                            function GetFileVersion(const AFileName: string): Cardinal;
                            var
                             FileName: string;
                             InfoSize, Wnd: DWORD;
                             VerBuf: Pointer;
                             FI: PVSFixedFileInfo;
                             VerSize: DWORD;
                            begin
                             Result := Cardinal(-1);
                             // GetFileVersionInfo modifies the filename parameter data while parsing.
                             // Copy the string const into a local variable to create a writeable copy.
                             FileName := AFileName;
                             UniqueString(FileName);
                             InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
                             if InfoSize <> 0 then
                             begin
                               GetMem(VerBuf, InfoSize);
                               try
                                 if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then
                                   if VerQueryValue(VerBuf, "\", Pointer(FI), VerSize) then
                                     Result:= FI.dwFileVersionMS;
                               finally
                                 FreeMem(VerBuf);
                               end;
                             end;
                            end;
                            Ответить
                            • Теперь понятно?
                              Ответить
                              • Не совсем. Ты хочешь сказать, что оно похерит данные входного параметра, даже если его передать как неконстантную строку?
                                Ответить
                                • * неконстантную в смысле без указания const, но и без var, по идее при этом и создаётся локальная копия.
                                  Ответить
                                  • Строки в делфи особенные. Один раз выделяется память под строку, а операции присваивания лишь изменяют счетчик ссылок. Компилятор неявно вызвает UniqueString, когда ему кажется, что строка будет изменена (в справке вроде так написано). Особенность в том, что в данных примерах передаётся указатель на строку (PathRemoveArgs(pchar(s));), а процедура рассматривает его как InOut, т.е. повреждение данных вполне возможно.
                                    Ответить
                                    • Т.е. строки неизменяемые?
                                      Ответить
                                      • То есть как - неизменяемые?
                                        Ответить
                                        • То есть, существующую строку нельзя изменить, для этого надо создать новую (объект, на который ссылаются ссылки)
                                          Ответить
                                          • Там немного хитрее. Если счётчик равен одному - строку менять можно, т.к. её буфер больше никто не видит. Если счётчик больше 1 - менять нельзя, поэтому делается копия буфера, у которой счётчик будет равен 1, и её можно будет менять.

                                            В Qt QString точно так же работает.
                                            Ответить
                                            • P.S. При этом у старого буфера счётчик уменьшается на 1. И если там окажется единичка - его тоже смогут менять без копирования.
                                              Ответить
                                            • То есть, по сути неизменяемые. В cpython тоже так.
                                              Ответить
                                              • Ну почему неизменяемые то? Когда буфер не расшарен - ещё как изменяемые.

                                                Неизменяемые это в жабе. Создал и всё. Больше никто никогда не поправит.
                                                Ответить
      • А если у меня файл, имя которого заканчивается крышкой, что делать?
        Ответить
        • интерпретатор юзает SearchPath. Возможно, стоит дублировать символ?
          Ответить
        • Наверно, эскейпнуть ее.
          Ответить
          • А можно имя файла завернуть в кавычки...

            Единственного решения на все случаи жизни нет.
            Ответить
            • Недавно наткнулся на пост, там опытные юзера разбирали аналогичный вопрос, только там не одни кавычки, а кавычки и пробел, в имени файла. Задача достаточно нетривиальная, универсального решения быть не может, соглашусь.
              Ответить
            • >А можно имя файла завернуть в кавычки...
              Ты это к тому, почему кавычки эскейпятся не крышкой? Но в баше же с этим как-то живут.
              Ответить
              • >>Но в баше же с этим как-то живут.
                Возможно, Вы имели в виду: в башне?
                Ответить
    • \^ vs ^\
      Ответить
      • \^_^\
        Прям ониме какое-то.
        Ответить
      • \ походу эскейпит только кавычки.
        Ответить
        • А % эскейпит только процент.
          Ответить
          • Зеленый лишний был.
            Ответить
            • Да, но зато все заметили, что у Микрософта слишком много эскейп-символов.
              Ответить
              • Каждый раз, когда мне приходилось более менее серьезно изучать бат - я проклинал его, но, сука, тут же даже не бат а тупо командная строка. Мне только из-за этого гуй юзать? Мб. хватит питона 2 с его глючными литералами строк?
                Ответить
              • Майкрософт - один сплошной эскейп-символ. Вчера винда обновилась, теперь дрожу от страха. Обама явно что-то замышляет, небось поручил напихать троянов в патчи.
                Ответить
    • Где-то есть правила эксейпинга?
      Ответить
    • http://www.daviddeley.com/autohotkey/parameters/parameters.htm#WINCRULESDOC

      Охуенчик
      Ответить
    • Лень создавать отдельный тред...

      Шел 2015 год, а разрабы ланчера пятой ГТА так и не осилили юникодные пути. Они его на делфи 7 что ли писали?
      Ответить
      • >>делфи 7

        Вы так говорите, будто это что-то плохое.
        Ответить
      • Седьмой же юникодный, в отличие от того, каким был скомпилирован тотал коммандер.
        Ответить
        • С поддержкой юникода. Но по умолчанию емнип не юникод.
          Ответить
        • Гислер переписал все юниты под wide.
          Ответить
          • А у седьмой делфи код полностью открыт?
            Ответить
          • Хуй собачий он переписал. Где-то я натыкался на стандартный глюк байтовых полей (если выделить руссий текст, когда выставлен нерусский язык клавиатуры и скопировать - вставятся козюбрики)
            Ответить
            • Лажа-то какая( Обидно, прям.
              Ответить
              • Было с ним интервью, где он говорил, что не хочет перейти на свежий делфи чуть не из-за совместимости с win 3.х (было это где-то в 2006-2007), тогда я подумал, что он окончательно ебанулся.
                Ответить
      • >> Они его на делфи 7 что ли писали?
        так вот куда исчезал стретор....
        Ответить
      • Виндофоновский RD клиент тоже в своё время (щас не знаю) не умел подрубаться к компу, если у того в названии была кириллица.
        Они не одиноки
        Ответить
        • А firebird не цепляется к базе, если комп называется COM1...
          Ответить
          • Ну это вообще известная вендофигня, известная с 90-х. Был один игровой сервер, который создавал файлы с именами юзеров. Если зарегать юзера с именем LPT1, он тупо вис.
            Ответить
      • Он официальный, этот ланчер?
        Ответить
        • Ага. Social Club или как там его. Жаловались, емнип, именно купившие, а не пираты.
          Ответить
          • >Жаловались, емнип, именно купившие, а не пираты.
            Что-то удивительное?
            Ответить
            • Это часть фразы о том, что ланчер официальный.

              А удивляться тут нечему. После второго ведьмака, у которого конфигурялка писала конфиг в одну папку, а движок читал из другого, чему-то удивляться уже сложно...
              Ответить
              • Я понял. Что удивительного что жаловались купившие?
                Ответить
                • Помню покупали лицензию 1С 7. с аппаратным ключом, через какое то время ставили эмулятор ключа потому как от этого ключа глюков было не мерено.
                  Ответить
                  • У 1с ещё есть (или были?) ебанутые ключи с ограниченным количеством активаций. Переставил винду 3 раза - покупай новый ключик.
                    Ответить
                • Абсолютно ничего удивительно. Просто факт, которым я пытался подтвердить официальность ланчера.
                  Ответить
                  • Лаунчер, компилировался на пиратской винде.
                    ЗЫ типичная отмазка ТП, какого нить интепрайзного софта который не неприлично глючит.
                    Ответить
                    • Да почему на пиратской? Просто компилировали и тестировали америкосы, которым юникодные символы в именах нахуй не сдались.
                      Ответить
                      • Зеленные чернила кончились.
                        Ответить
                      • И что сделали после багрепортов?

                        А вот со старкрафтом бы такого не было.
                        Ответить
                        • Да пофиксили вроде, там первый патч на несколько гигов был. Я не в курсе, нету особого желания в гта бегать. Тем более в такую сырую.
                          Ответить
                          • По-моему, уже даже пендосы должны были понять, что не поддерживать юникод в 2015 году просто некультурно. А что игры выпускают сырыми - уже привычно, вот когда устройства выпускают с сырой прошивкой. У меня щас всечатление, что устройстра надо покупать не раньше полугода-года, чтобы прошивка устаканилась.
                            Ответить
                            • > устройства выпускают с сырой прошивкой
                              Я лет 10 назад купил себе плеер с SD карточкой. Вот где была *пиздец* сырая прошивка. Никакие настройки не сохранялись - ни громкость, ни последний трек, ни радио. На битрейтах больше 128 - треск и щелчки. Потом вышла прошивка, которая всё это с горем пополам пофиксила. А через полгода плеер исчез с сайта производителя. Как-будто его и не выпускали. Предыдущие и следующие модели были, а эта пропала. Я тогда радовался, что успел вовремя накатить прошивку...
                              Ответить
                    • Это кто таким сегодня занимается?
                      Ответить

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