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

    −25

    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
    /***********************************************************************************
     *
     * AddItem
     *
     * Adds SearchTemplate search to the internal search engines list
     * and to the UserSearches
     *
     ***********************************************************************************/
    OP_STATUS SearchEngineManager::AddItem(SearchTemplate* search)
    {
    	// trying to modify searches before LoadSearchesL() ?
    	OP_ASSERT(HasLoadedConfig());
    
    	if (!search->GetUniqueGUID().HasContent())
    	{
    		OpString guid;
    		if (OpStatus::IsSuccess(StringUtils::GenerateClientID(guid)))
    		{
    			search->SetUniqueGUID(guid.CStr());
    			OP_ASSERT(search->GetUniqueGUID().HasContent());
    		}
    	}
    
    	// Should never add item that's already in the list
    	SearchTemplate* temp = g_searchEngineManager->GetByUniqueGUID(search->GetUniqueGUID());
    	OP_ASSERT(!temp);
    
    	OP_STATUS status = m_search_engines_list.Add(search);
    
    	if (OpStatus::IsSuccess(status))
    	{
    		m_usersearches->AddUserSearch(search);
    		
    #ifdef SUPPORT_SYNC_SEARCHES
    		BroadcastSearchEngineAdded(search);
    #endif
    	}
    
    	return status;
    }

    Оттуда.

    Результат вызова метода используется только в ассерте (см., например, переменную temp). Т. е. сборке для release полностью игнорируется, хотя ресурсы на вызов ненужного метода потрачены.

    Запостил: inkanus-gray, 20 Января 2017

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

    • SEO-пост.
      Ответить
    • Тащемто код выглядит неплохо. Особенно для такого древнего говна.
      Ответить
      • ПС: А я и в релизе ассерты оставляю. Лучше пускай процессор немного погреется, чем я потом буду по кор-дампу гадать, что же случилось.
        Ответить
        • Но тут-то в релизе макрос OP_ASSERT определяется как (void)0 и только в дебаге он компилируется во что-то полезное.

          Вот ещё пример:
          CreateFileOperation::CreateFileOperation(const OpFile& file,
          		OpFileInfo::Mode file_mode)
          	: m_file_mode(file_mode)
          {
          	const OP_STATUS copied = m_file.Copy(&file);
          	OP_ASSERT(OpStatus::IsSuccess(copied) || !"Could not create OpFile copy");
          }


          Перед ассертом выполняется полезная операция, но проверка статуса выполняется только в дебаге.
          Ответить
      • Вообще на удивление код документирован, разбит на модули (в терминологии Оперы; по сути это библиотеки), у каждого модуля есть описание.

        MSVC выдаёт ворнинги всего пяти типов:

        1. local variable is initialized but not referenced, когда после инициализации переменной идёт OP_ASSERT.

        2. default constructor could not be generated; user defined constructor required, когда конструктор объявляется только в некоторых сборках, а в остальных класс болтается вхолостую.

        3. 'type cast' : from function pointer <...> to data pointer 'void *'

        4. potentially uninitialized local variable — увы, есть и такой грех.

        5. unreachable code, когда выше по коду были return'ы (хотя на самом деле при некоторых условиях код достижим).

        Надо попробовать собрать gcc, шлангом и другими компиляторами для сравнения.
        Ответить
        • Похоже визуалстудия фолс позитивит, как пивасстудия. Обязательно попробуй гцц.
          Ответить
          • Похоже, что придётся расчехлять Линукс.

            Хотел скомпилировать в Mingw или в Cygwin, но в проекте почти нет мейкфайлов, потому что используется собственная система сборки flower, написанная напитоне. Никогда бы не подумал, что Опера пошлёт меня напитон... Питонячий код использует вызов метода poll, который в прыщеговне виндовом порте Питона отсутствует. Значит, чтобы скомпилировать из-под Windows, придётся переписывать вот это:
                def run(self):
                    "Main loop of the background thread. Does not return."
                    while True:
                        for fd, event in self._poll.poll():
                            if fd == self._rfd_control:
                                # The fd set is updated, restart the poll
                                os.read(self._rfd_control, 1)
                            elif fd in self._streams:
                                self._streams[fd].read()

            И вот это:
                    self._poll = select.poll()
                    self._poll.register(self._rfd_control, select.POLLIN)
            Ответить
            • Две идеи по портированию flower на Windows:

              1. В винсокете, начиная с Висты, появилась функция WSAPoll, которая является аналогом никсового poll. Но для её использования придётся патчить и перекомпилировать прыщеговно:
              https://bugs.python.org/issue16507

              2. Заменить в скриптах select.poll() на select.select() (и соответственно пропатчить другие вызовы).
              Ответить
              • Note: File objects on Windows are not acceptable, but sockets are. On Windows, the underlying select() function is provided by the WinSock library, and does not handle file descriptors that don’t originate from WinSock.

                Вот жопа.
                Ответить
                • Всё-таки заменил select.poll() на select.select(), а вместо os.pipe() использовал socket.socketpair() из пакета backports.socketpair.

                  Теперь ругается на отсутствие сигналов...
                  Ответить
                  • Печаль:
                    http://python.su/forum/topic/12946/
                    Ответить
                    • Ну вот я давеча втирал что гуникорн не может винду ровно потому что такого ипц как сигналы на непозиксовой винде нет
                      Ответить
                      • Попытался запустить без сигналов. Питон ругается, что в виндовую версию symlink не завезли, хотя в новых виндах на NTFS симлинки есть.

                        http://stackoverflow.com/questions/6260149/os-symlink-support-in-windows
                        Ответить
                  • в пекло эти сорта полла, прошлый век
                    комплишн порты надо использовать для нормальной асинхронщины на шиндошс
                    тот же буст.асио
                    Ответить
                    • Асио на винде вообще работает? В ченджлоге такие баги фиксят, что складывается впечатление, что там все уныло.
                      Ответить
                    • > тот же буст.асио

                      pydarasio, ага
                      Ответить
                      • > тот же буст.асио
                        как тот же буст.асио
                        скрывает под капот всю эту платформозависимость

                        гугл подсказывает, что и для питонодоширакоблядей есть потуги, всякие PyParallel, ну или вот http://bugs.python.org/issue16175
                        Ответить
                      • > pydarasio, ага

                        Яндекс ничего не нашёл по этому запросу, а Гугл предложил поискать пидарасов.
                        Ответить
                    • И правда комплишены хороши, да еще и апи у них одинаковый для файлов и сокетов и устройств

                      Вау
                      Ответить
                • Конечно

                  Для файлов нужно оверлапд и вейтформультиплобжекц или GetOverlappedResult

                  Кстати , еполл в линуксе тоже не совсем честно полит файлы

                  Но апи, конечно, приятнее
                  Ответить
    • > UniqueGUID
      А есть функция GetNonUniqueGloballyUniqueIDentifier?
      Ответить
    • Оттуда - это откуда?
      Ответить
      • Из той прохладной страны, в которой стоит одноимённая с этим проектом гора, о которую разбился Ту-154; где в день рагнарёка Одина убьёт Фенрир, проглотив предварительно Солнце, где змей Ёрмунганд выведет море из берегов, но погибнет от молота Тора, где Сурт выжжет землю своим пылающим мечом, где эйнхерии сразятся с ётунами.
        Ответить
        • мрачные мужики в шлемах с рогами и рыжими бородами наедятся грибов, и как давать программировать
          Ответить
          • Разве можно без мухоморов написать код типа http://govnokod.ru/22011?
            Ответить
        • > где в день рагнарёка Одина убьёт Фенрир

          Возможно, это был первый в истории человечества спойлер
          Ответить
          • Скандинавские мифы ориентировочно описывают события скандинавского бронзового века (как Илиада с Одиссеей описывают события период коллапса Бронзы). Соответственно, греческий спойлераст Тиресий был [придуман] лет за семьсот до описываемого спойлера.
            Ответить
        • Нихуя не понял. Наверное, потому что я не смотрю аниме.
          Ответить
          • Хм, а я вроде уже вбрасывал сюда ту самую мангу про Локи.
            Ответить
          • > потому что я не смотрю аниме

            Аниме тут не при чём. Это скандинавская мифилогия, проверь.
            Её даже в школе проходят в шестом классе (во всяком случае, у нас была).
            Ответить
            • Ладно, лучше скажите откуда код.
              Ответить
            • > Аниме тут не при чём.
              Видимо, он всё-таки зацепил одним глазом весьма популярную анимеху, где из этой самой мифологии кучу отсылочек надёргали...
              Ответить
              • Видимо, он всё-таки зацепил одним глазом весьма популярную анимеху, из которой скандинавы для своей мифологии отсылочек надёргали...

                fxd
                Ответить

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