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

    +147

    1. 1
    2. 2
    3. 3
    4. 4
    QT project:
    
    t=x1; x1=x2; x2=t;
    t=y1; x1=y2; y2=t;

    И еще 90 говнопятнышек!
    Налетай: http://www.viva64.com/ru/a/0077/

    Запостил: Andrey_Karpov, 25 Октября 2011

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

    • нормальный свап. зачем создавть фн свап, если надо только в одном месте?
      Ответить
      • Вот вот. "Нормальный свап". Читаем статью, и ощущаем всю глубину наших глубин.

        Ошибка там. Смотрите внимательнее.
        Ответить
        • Чего, собственно, здесь есть интересного? Может быть я не понимаю всю "глубину"?
          Ответить
          • 1) Открываем ссылку.

            2) Смотрим на статью.

            3) Обнаруживаем разжеванное описание:

            Ошибка найдена с помощью диагностики V519: The 'x1' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 2218, 2219. Qt3Support q3canvas.cpp 2219

            Первая строчка совершенно корректна и обменивает значения в переменных x1 и x2. Во второй строке должны быть обменены переменные y1 и y2. Эта строка видима была копией предыдущей. В ней надо было заменить все буквы 'x' на буквы 'y'. К сожалению, в одном месте это забыли сделать: "... x1=y2; ...".

            Корректный код:

            t=x1; x1=x2; x2=t;
            t=y1; y1=y2; y2=t;
            Ответить
    • swap it! 2G guaranteed
      Ответить
    • Это что, реклама?
      Ответить
    • Сегодня сделал копипаст, а завтра Родину продаст.
      Ответить
    • Ба, знакомые всё лица
      http://govnokod.ru/7781
      http://govnokod.ru/7781#comment105845
      Ответить
      • Видел я этот говнокомментарий. Даже ничего отвечать не стал. Статью надо читать внимательно. Кто имеет голову - тот поймет. Кто не понимает - ну и бог с ним.
        Ответить
        • > Даже ничего отвечать не стал.
          > http://govnokod.ru/7781#comment115769
          :-Р

          ЗЫ: А знаете, кто отсутствует в нашем курятнике? Ilfak_Guilfanov!
          Ответить
          • Это я только что. Раз пошла такая пьянка.
            Ответить
            • Я видел. Но проблема в другом. Мы вас здесь не хотеть и ваш статический к-анализатор не покупать. Смиритесь.
              Ответить
              • Мы даже на это и не надеемся. Но отрицательной рекламы не бывает. Мы рады, если кто-то кому-то расскажет, какие мы плохие.
                Ответить
                • > Я тут один.
                  Соврамши, ваших здесь как минимум двое отметилось.

                  > кому-то расскажет, какие мы плохие.
                  Скорее - унылые и постите несмешной говнокод с целью привлечь аудиторию к своему продукту.

                  Кстати, хотя бы радуга из единорога-то - оригинальная пикча?
                  Ответить
                • Да никто никому ничего не расскажет. Разве что разовьёте аллергию на свой продукт и если когда-то кто-то о нём заикнётся, ему тут же заткнут пасть. Знаете, как IT-ишники относятся к спаму?
                  Ответить
                  • > Знаете, как IT-ишники относятся к спаму?
                    вардан_кушнир_vs_клофелинщицы.avi
                    Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • Хорошо. Развиваемся. Медленнее чем хотелось бы, но стараемся. Вот релиз сегодня очередной сделали. PVS-Studio 7.04 - https://www.viva64.com/ru/b/0665/
                    Готов ответить на вопросы.
                    Ответить
          • >> ЗЫ: А знаете, кто отсутствует в нашем курятнике?

            В 2011-м году здесь были петухи?
            Ответить
    • Тут недавно пытались провести конкурс на swap значений переменных...
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • VivaCore мы не рекламировали. Даже непонятно, где вы встретили её упоминание :). Мы уж лет 5 вообще про неё нигде не упоминаем в статьях. Нет, скачать её негде и как таковая она уже давно перестала быть отделима от PVS-Studio.
        Ответить
    • Лол, призвали человека через семь лет после публикации поста. Вот это некромантия!

      csrf verification error
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • Вива ла Дива, Вива Виктория,
      Афродита.
      Вива ла Дива, Вива Виктория,
      Клеопатра.
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • Не CEO, а CTO.
          Ответить
          • Ну как там с «PVS-Studio» обстоит вопрос?
            Ответить
            • Нейреции должны были вытеснить все наработки
              Ответить
              • Подножка для AI в виде UTF-8 - https://pvs-studio.ru/ru/blog/posts/cpp/1298/
                Ответить
                • Ошибка, связанная с незнанием времени жизни результата substr, проявляется только если подставить подножку, сказав, что нужно обрабатывать UTF-8, или без этого условия тоже может споткнуться?
                  Ответить
                • Как вы считаете, Андрей, Расту нужны ваши продукты?
                  Ответить
                  • Не смотрели в его сторону. Нам пока хватает других языков.
                    Ответить
                • >
                  Функция substr создаёт временный объект типа std::string, который затем разрушается. В результате в current_word сохраняются указатели на уже разрушенный объект.
                  >

                  это довольно школьная ошибка. Еще Страуструп приводит пример как из стринга взяли c_str с известынм результатом. До конца выражения он дожил, а дальше всё.

                  Вот потому в расте такое и не скомпилируется: не может ссылка пережить родителя.
                  Ответить
          • Станция Технического Обслуживания?
            Ответить
          • Трижды CTO это сколько?
            Ответить
    • Именно поэтому я за S" Forth", его просто невозможно статически анализировать. Пишу что хочу и теку.
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • Смотря какой, если код и данные в одну кучу будет сложно.

          Кстати, кто-нибудь пробовал декомпилировать программу и прогнать через аналолизатор?
          Ответить
        • Кстати, како-нибудь дизассемблер или декопулятор этим и занимается. Только ошибки не ищет.
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Хороших декопуляторов я тоже не знаю. Есть декопуляторы в псевдо-си, по-моему в IDA PRO что-такое было.
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                • Это вот он:https://github.com/yegord/snowman/tree/v0.1.3
                  Можно и standalone версию.

                  А что? Со своим назначением он справляется. Ветвления, циклы, свитч-кейзы, вызовы функций распознает. Правда код выдает gcc-шный, еще там для флагов тип int1_t, это что?

                  Кстати, судя по листингу на картинке декомпилировали данные или мусор, либо ассемблерный код, компиляторы вроде не юзают das и подобные инструкции (это bcd вроде, их вообще никто не использует) и xlat.
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                  • Декомпилировал http://govnokod.ru/25778#comment498330
                    struct s0 {
                        signed char[11] pad11;
                        uint32_t f11;
                    };
                    
                    int32_t GetStdHandle = 0x109c;
                    
                    int32_t WriteConsoleA = 0x10ac;
                    
                    int32_t ExitProcess = 0x10bc;
                    
                    struct s1 {
                        unsigned char f0;
                        signed char[10] pad11;
                        signed char f11;
                    };
                    
                    void fun_401000() {
                        int32_t v1;
                        int32_t ecx2;
                        signed char* edi3;
                        int32_t eax4;
                        struct s0* esi5;
                        int32_t eax6;
                        struct s1* eax7;
                        uint32_t ebp8;
                        unsigned char al9;
                        unsigned char tmp8_10;
                        uint1_t cf11;
                        int32_t ebx12;
                        int32_t ebx13;
                    
                        v1 = reinterpret_cast<int32_t>(__return_address());
                        ecx2 = 11;
                        edi3 = reinterpret_cast<signed char*>(0x40103c);
                        eax4 = 0x202c;
                        do {
                            ++edi3;
                            esi5 = reinterpret_cast<struct s0*>(reinterpret_cast<int32_t>(esi5) + 1);
                            if (*edi3 == 44) {
                                *(edi3 - 1) = *reinterpret_cast<signed char*>(reinterpret_cast<int32_t>(&eax4) + 1);
                            }
                            --ecx2;
                        } while (ecx2);
                        eax6 = reinterpret_cast<int32_t>(GetStdHandle(0xf5, v1));
                        WriteConsoleA(eax6, 0x40103c, 11, fun_401000, ecx2, 0xf5, v1);
                        eax7 = reinterpret_cast<struct s1*>(ExitProcess(0, eax6, 0x40103c, 11, fun_401000, ecx2, 0xf5, v1));
                    Дальше мусор. Ну это нормально, тут код и данные в одной куче. Только почему он не кастит int32_t в указатель на функцию при вызове винапишных функций? Зато в остальных местах понапихано reinterpret_cast'ов.

                    Вобщем только как помощник человекам годится.
                    Ответить
                    • Откуда-то лишние агрументы берет.
                      Ответить
                    • Попробовал декомпилировать этот пример «Бумерангом» (boomerang.sf.net). Он даже не смог определить формат экзешника. Вероятно, он ожидает, что ему скормят экзешник, сгенерированный популярными линкерами.
                      Ответить
                    • @@reinterpret_cast

                      Больше reinterpret_cast'ов богу reinterpret_cast'ов!
                      Ответить
                    • Переведи на "PHP".
                      Ответить
                  • >> это bcd вроде, их вообще никто не использует

                    Я использовал какую-то инструкцию для BCD, когда мы соревновались в написании самой короткой программы в ASCII-кодах, которая ничего не делает, просто возвращает управление системе.

                    Кстати, в длинном режиме x86-64 что-то из этих инструкций выкинули (то ли XLAT, то ли всю пачку BCD, то ли и то, и другое).
                    Ответить
                • Почему в «IDA View A» код 64-битный, а в окне плагина «Snowman» — 32-битный? Он неправильно определил разрядность кода, поэтому и выдал «das», «out», «xlat» — вот это всё?
                  Ответить
            • > диза занимается довольно тупой вещью: преобразованием опкодов в их мнемоники

              Если бы. На коротких сниппетах — да.

              При дизассемблировании длинных программ с ветвлениями и циклами приходится определять начала цепочек опкодов (на CISC можно поймать забавные багры), локализовывать и классифицировать данные. Проблемы возникают с интерпретацией магических констант. Например, 42 — это просто число или смещение в памяти какого-то объекта?

              Далее если это не com-файл для DOS, то среди кода есть перемещаемые данные, которые фиксит загрузчик при старте.

              В общем, когда начнёшь писать дизассемблер, способный выдать асм-файл, который можно скомпилировать, не испортив программу, увидишь, что проблемы растут как снежный ком.

              Это для hiew или турбо-дебаггера легко написать «дизассемблер», который показывает опкоды для короткой цепочки кода (и то бывают багры на CISC или бесполезный выхлоп из-за отсутствия интерпретации констант).
              Ответить
              • P.S. Вот вкусняшка для CISC:

                https://govnokod.ru/13242
                Ответить
            • >жавап
              >дик-пик
              о чем это всё?
              Ответить
    • Навскидку. https://www.viva64.com/ru/w/V804/

      >804. Decreased performance. The 'Foo' function is called twice in the specified expression to calculate length of the same string

      Кто юзает strlen в 20 году? Ставьте лойс.
      Ответить

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