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

    +2

    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
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    void KateQuickOpen::update () {
      // пропущено
      QModelIndex idxToSelect;
      int linecount = 0;
      QMapIterator<qint64, KTextEditor::View *> i2(sortedViews);
      while (i2.hasNext()) {
            i2.next();
    
            KTextEditor::Document *doc = i2.value()->document();
    
            if (alreadySeenDocs.contains(doc))
              continue;
    
            alreadySeenDocs.insert (doc);
    
            QStandardItem *itemName = new QStandardItem(doc->documentName());
    
            itemName->setData(qVariantFromValue(QPointer<KTextEditor::Document> (doc)), DocumentRole);
            itemName->setData(QString("%1: %2").arg(doc->documentName()).arg(doc->url().pathOrUrl()), SortFilterRole);
            itemName->setEditable(false);
            QFont font = itemName->font();
            font.setBold(true);
            itemName->setFont(font);
    
            QStandardItem *itemUrl = new QStandardItem(doc->url().pathOrUrl());
            itemUrl->setEditable(false);
            base_model->setItem(linecount, 0, itemName);
            base_model->setItem(linecount, 1, itemUrl);
            linecount++;
    
            if (!doc->url().isEmpty() && doc->url().isLocalFile())
              alreadySeenFiles.insert (doc->url().toLocalFile());
    
            // select second document, that is the last used (beside the active one)
            if (linecount == 2)
              idxToSelect = itemName->index();
        }
    
      // get all open documents
      QList<KTextEditor::Document*> docs = Kate::application()->documentManager()->documents();
        foreach(KTextEditor::Document *doc, docs) {
            // skip docs already open
            if (alreadySeenDocs.contains (doc))
              continue;
    
            QStandardItem *itemName = new QStandardItem(doc->documentName());
    
            itemName->setData(qVariantFromValue(QPointer<KTextEditor::Document> (doc)), DocumentRole);
            itemName->setData(QString("%1: %2").arg(doc->documentName()).arg(doc->url().pathOrUrl()), SortFilterRole);
            itemName->setEditable(false);
            QFont font = itemName->font();
            font.setBold(true);
            itemName->setFont(font);
    
            QStandardItem *itemUrl = new QStandardItem(doc->url().pathOrUrl());
            itemUrl->setEditable(false);
            base_model->setItem(linecount, 0, itemName);
            base_model->setItem(linecount, 1, itemUrl);
            linecount++;
    
            if (!doc->url().isEmpty() && doc->url().isLocalFile())
              alreadySeenFiles.insert (doc->url().toLocalFile());
        }
    
        // insert all project files, if any project around
        if (Kate::PluginView *projectView = m_mainWindow->mainWindow()->pluginView ("kateprojectplugin")) {
          QStringList projectFiles = projectView->property ("projectFiles").toStringList();
          foreach (const QString &file, projectFiles) {
            // skip files already open
            if (alreadySeenFiles.contains (file))
              continue;
    
            QFileInfo fi (file);
            QStandardItem *itemName = new QStandardItem(fi.fileName());
    
            itemName->setData(qVariantFromValue(KUrl::fromPath (file)), UrlRole);
            itemName->setData(QString("%1: %2").arg(fi.fileName()).arg(file), SortFilterRole);
            itemName->setEditable(false);
            QFont font = itemName->font();
            font.setBold(true);
            itemName->setFont(font);
    
            QStandardItem *itemUrl = new QStandardItem(file);
            itemUrl->setEditable(false);
            base_model->setItem(linecount, 0, itemName);
            base_model->setItem(linecount, 1, itemUrl);
            linecount++;
          }
        }
    
        // swap models and kill old one
        m_model->setSourceModel (base_model);
        delete m_base_model;
        m_base_model = base_model;
    
        // пропущено
    }

    Адская копипаста. У меня мозг сегфолтится при попытке ее формализировать.

    https://projects.kde.org/projects/kde/applications/kate/repository/revisions/master/entry/kate/app/katequickopen.cpp#L135

    Запостил: Elvenfighter, 16 Февраля 2014

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

    • показать все, что скрытоВо-первых, лакни мои яйца.
      Во-вторых, все последующие комментарии к этому посту оставлены педерастами.
      Ответить
    • во. класный пример.

      кто-нибудь знает штатную тулзу для выявления таких копи-паст?

      я сам как-то пару раз чего-то на шеле собирал (плюс для вима макрос для диффа двух фрагментов) но хотелось бы что бы это кто-то за меня написал. в эклипсе может есть какой плагин?
      Ответить
      • Была идея для стартапа: анализатор кода, выявляющий похожие участки кода в пределах проекта, с плагинами для поиска на гитхабе / мейвене / стандартной библиотеке языка и вообще синтетическое программирование с веб-интерфейсом, коммунити и чтобы Гугл сразу купил. Но что-то никто не загорелся осуществлять.
        Ответить
        • показать все, что скрытоЛакни мои яйца.
          Ответить
        • Я так понимаю суть этого стартапа нанять 100500 китайцев, идусов, местных доширатчиков день и ночь ищущих копи паст. ИМХО на автомате такого не сделать. Могут быть изменены имена переменных, константы и т.п. Если это игнорировать то как копипаст будут определятся любые синтаксические конcтрукции типа if
          Ответить
          • показать все, что скрытоЯ так понимаю, ты не откажешься от вкусного сомалийского хуйца?
            Ответить
          • ну, можно предположить что если не совпадает форматирование или отличаются больше 15% символов, то это не копипаст. Или нейронную сеть приспособить. Никто ведь 100% надежности распознавания не требует, главное чтоб Гугл сразу купил.
            Ответить
          • http://en.wikipedia.org/wiki/Program_synthesis


            Т.е. сначала производится детальный разбор кода, потом по графу АСТ ищутся "знакомые" алгоритмы, и сравниваются с библиотечными.
            Кроме того, можно делать предположения исходя из названий переменных / функций о том, что этим хотел сказать автор, и генерировать программу в надежде на хотя-бы совпадение с исходником.
            Ответить
            • показать все, что скрытоЯ медленно проникаю в твой анус...
              Ответить
            • Кстати, идея с анализом сигнатур графов - офигенная. Думаю, гугол в самом деле купит такое.
              Ответить
              • я может покажусь дебилом. но я не пойму как их анализировать.
                Как я это вижу взять на генерировать кучу АСТ деревьев базовых алгоритмов до хуища много алгоритмов.
                Затем по коду искать куски кода которые будут сходится с теми что есть. Но мне эта задача кажется не выполнимой.
                Ответить
                • Хоть я и не понимаю, о чём речь, но свою лепту я обязан вставить.

                  >>>"как их анализировать"

                  Терморектальным криптоанализом.
                  Ответить
                  • > Терморектальным криптоанализом.
                    Это точно... Иногда такой код бывает, что даже сам автор без паяльника в жопе не объяснит, что оно вообще делает, и что он хотел запилить...
                    Ответить
                • http://en.wikipedia.org/wiki/Graph_rewriting

                  Это в общих чертах о том, как искать. (В очень общих чертах). На самом деле, оптимизирующие компиляторы что-то подобное делают, особенно в языках с подразумеваемым параллелизмом. Например, программист написал цикл, а компилятору этот цикл нужно переделать в создание матрицы определенного размера, заполнения ее данными, получеными врезультате цикла и т.д.
                  Но это очень сложный процесс. Больше всего похожий даже не на компиляторы, а на пруверы для электроники, типа тех, которыми микрочипы проверяют. Схемы современных микрочипов практически никогда не понятны человеку, они просто очень сложные. Так что там сколько паяльник не суй...

                  Тут, как бы, кроме идеи нужна еще теоретическая и практическая базы. Нужно сначала доказать, что такое вообще возможно для более-менее нетривиальных ситуаций, и что такие программы не будут, например, выполнятся неделями на ультрасовременном оборудовании.
                  Ответить
                  • >а на пруверы для электроники, типа тех, которыми микрочипы проверяют.
                    Можно подробнее?
                    Ответить
                    • http://en.wikipedia.org/wiki/ACL2

                      Например. Но это не самое популярное, что есть.
                      Есть еще такое:
                      http://research.microsoft.com/en-us/projects/vcc/


                      O. Вспомнил, вот это, самое популярное, наверно:
                      http://en.wikipedia.org/wiki/Verilog
                      Ответить
              • Ее надо в ide встраивать. Пишешь ты поиск чего-то циклом, а ide тебе говорит: "вот тут функция indexOf() есть, с похожей логикой, может быть на нее заменим?". Исправление, совмещенное с обучением ;)
                Ответить
                • Охуеть, антивелосипедная среда!
                  Ответить
                • А еще... в рантайме можно будет находить похожие участки кода, и по-типу хотспота перекомпилировать программы, выбрасывая дубликаты.
                  А еще, когда программы поумнеют, и начнут разможатся самосовершенствуясь (а не просто мутируя)...
                  Ответить
                • Но иногда ведь действительно нужно написать велосипед
                  https://github.com/roman-kashitsyn/libdocset/blob/master/src/type_names.c#L213
                  Ответить

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