1. PHP / Говнокод #26418

    +4

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    if ($input->search_text!=""){
    		if ($input->search_text=="хуйня" or $input->search_text=="ХУЙНЯ" or $input->search_text=="Хуйня")
    			$this->result.="У нас серьезная компания и мы всякой хуйни на сайте не держим.";
    		else{
    		if (strlen($input->search_text)<2)
    			$this->result.="Строка поискового запроса должна состоять минимум из 2 символов.<br>Пожалуйста, измените Ваш запрос и повторите поиск.";
    		else{
    			$result.="Вы искали: <u><b>".$input->search_text."</b></u><br><br>";

    Вот такие вот пасхалки у серьёзных компаний. И такой код.

    Запостил: vistefan, 07 Февраля 2020

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

    • XSS
      Ответить
    • серьезная компания с продуктом на пхп
      Ответить
      • фейсбук, вк ? Баду
        Ответить
        • Именно поэтому я за «PHP».
          Ответить
        • В фейсбуке и ВК PHP только на фронте, а кроме того файсбук автивно продвигает питон
          Ответить
          • Уверен ?
            Ответить
            • да. БОльшая часть вк написана олимпиадниками на сях, а вот фейсбцук

              Over 21% percent of overall codebase infrastructure is covered by Python at Facebook while rest is covered by Java, C, and C++ with 9%, 15%, and 55% respectively.
              Ответить
              • Це фейк, чтобы потешить самолюбие крестоблядей
                Ответить
                • Конечно же это правда. Тебе просто обидно это признавать. Обидно и больно. Я тебя понимаю
                  Ответить
      • https://habr.com/ru/company/badoo/
        Ответить
        • Я не знаю, что такое байду
          Ответить
          • серьезная компания с продуктом на пхп
            Ответить
            • define "серьезная"
              Ответить
              • Я не знаю. Но 16 место на швабре и 315 постов внушают доверие.
                Ответить
                • та он чванливый далпаёп, опухший от высокомерия
                  Ответить
            • [quote]
              В один из таких моментов мы выделили целую группу, которая занималась тем, что искала разные неоптимальные штуки в PHP-скриптах и оптимизировала. Это происходило буквально «по капле»: здесь нашли процент, там нашли процент — несколько человек в течение месяца находили по проценту. В какой-то момент рядом оказался наш сишник einstein_man. Он решил посмотреть, что можно сделать: зашёл вечером, запустил Perf, нашёл пару проблем в экстеншенах PHP — и ускорил всё за пару вечеров на 13%!
              [/quote]

              ахахаххахах, сразу видать что там серьезные ребята
              Ответить
              • Какой багор )))
                Но у нас примерно так же, только на плюсах.
                Ответить
                • Ты вообще осознал масштаб пиздеца?

                  Чуваки без профайлера, вслепую, что-то оптимизировали (видимо кавычки меняли), потом сишник (выделенный человек, вероятно единственный, кто знает си и умеет профилировать) все исправил.

                  Это разве не ёбаный стыд?
                  Ответить
                  • > видимо кавычки меняли

                    Я так понял, что они ускоряли сишный код модуля. Какой смысл выжимать проценты из «PHP»?
                    Ответить
                    • "неоптимальные штуки в PHP-скриптах "

                      Они правили скрипты. Потом пришел сишник, и всё исправил
                      Ответить
                      • Да, стыд.
                        Ответить
                        • Ну вот, а ты гришь "серьезная"...

                          Вот например серьезная компания Netflix.

                          Там перформанс инженер напилил профайлер, который профилирует одновременно и нативный код, и жабу. И показывает "общий" стек и флейм граф. И программисты этим тулом у них пользуются.

                          У него про это ток был.
                          Ответить
                          • это и есть вышеопямнутый перф.

                            жабу он без мапов / frame pointer профилирует как гербейдж, для профилирования жабы с тем же flamegraph-выводом есть более удобный async-profiler, появившийся по следам
                            Ответить
                            • async тока на прыще работает (perf, впрочем, тоже), а фреймпоинтер жабы как тебе поможет? мапы все равно нужны
                              Ответить
                              • без него то ли вообще никак, то ли и с мапами никак, я не помню уже
                                Ответить
                                • фреймпоинтер нужен нативному коду чтобы раскручивать стек без наличия символов

                                  с символами он не нужен

                                  как он поможет джаве -- я не знаю, разве в JVM стек указывается с помощью регистра?
                                  Ответить
                                  • его тот самый Брендан Грегг для перфа завозил, вроде бы
                                    что там под капотом - извините, пока еще не настолько прошарен
                                    Ответить
          • «Байду» — это китайский поисковик.

            А «Badoo» — это очередной банальный сайт знакомств.

            Я читал заметки «Badoo» по хуйлоаду. Прочитал про их «Pinba engine» — средство мониторинга производительности сервера. Эти изобретатели реализовали «Pinba engine» как плагин к «MySQL», чтобы результаты можно было читать SQL-запросом.

            Я анскильный питух. Я не смог поставить «Pinba engine» ни на «MySQL», ни на «MariaDB», хотя плагины других производителей успешно ставил. Пробовал собирать из исходников. Всё компилируется, но только устанавливаю этот плагин в СУБД, как СУБД падает с сегфолтом. У них какой-то царский код, сильно зависящий от ключей компилятора.

            https://github.com/tony2001/pinba_engine
            Ответить
            • P.S. Они, оказывается, вторую версию выпустили:
              https://github.com/badoo/pinba2
              Ответить
            • кодец у этого тони -- ок
              D->per_thread_request_pool[0] = (pinba_pool *)calloc(cpu_cnt, sizeof(pinba_pool));
              	D->per_thread_request_pool[1] = (pinba_pool *)calloc(cpu_cnt, sizeof(pinba_pool));
              	if (!D->per_thread_request_pool[0] || !D->per_thread_request_pool[1]) {
              		pinba_error(P_ERROR, "failed to allocate per_thread_request_pool structs. not enough memory?");
              		return P_FAILURE;
              	}
              Ответить
              • Вот пидорас. А потом из-за таких приходится новые планки докупать.
                Ответить
              • Утекатор?
                Ответить
                • Представь себе ситуацию, когда [0] удалось аллоцировать, а [1] — нет. Из-за отказа в выделении места под [1] сработает условие и будет возвращено P_FAILURE, а [0] сам себя не освободит.
                  Ответить
                  • Я знаю. На это любят делать подъёбы на собеседованиях.
                    Ответить
                  • Я в этом смысле не очень в сях, но вот вопрос: а почему нельзя было сразу выделить память под весь per_thread_request_pool из двух элементов?
                    Ответить
                    • Возможно, их освобождать надо по отдельности. Или реаллочить.
                      Ответить
                      • А что будет, если сделать calloc для всего per_thread_request_pool, а потом free(per_thread_request_pool[0])? Программу распидорасит?
                        Ответить
                        • Тогда per_thread_request_pool[0] будет элементом типа pinba_pool (без укококозателя) и во free() не пролезет. А если освободить сам per_thread_request_pool, то дальнейшие обращения к нему будут UB.
                          Ответить
                          • Точно, туплю, выделится же память под экземпляры.

                            А есть какие-то хитрые механизмы, чтобы выделить память типа для всего per_thread_request_pool, но чтобы внутри это были указатели?
                            Ответить
                            • Ну вообще можно сделать как-нибудь так:
                              pinba_pool *per_thread_request_pool[2] = {};
                              per_thread_request_pool[0] = calloc(2*cpu_cnt, sizeof(pinba_bool));
                              per_thread_request_pool[1] = per_thread_request_pool[0] + cpu_cnt;
                              
                              // Второй элемент второго пула:
                              per_thread_request_pool[1][1];
                              Ответить
                              • >// Второй элемент второго пула:
                                >per_thread_request_pool[1][1]

                                он тоже пул!
                                https://govnokod.xyz/_26418/#comment-508522
                                Ответить
                                • Лолблядь, я думал, там pinba_bool, а они выделяют pinba_pool. Какой багор )))
                                  Ответить
                                  • зачем нужно два per_thread_request_pool, если они все равно удаляют их содержимое вместе?

                                    Есди он per_thread_request_pool, то там лежит реквест? Тогда почему его удаляют командой pinba_pool_destroy?

                                    Блядь, ваша си такая служноя..
                                    Ответить
                                    • Может, решили не заморачиваться с адресной арифмантией. Может, задел на будущее, в котором может понадобиться выделять только один из этих пулов, например. Может, говнокод.
                                      Ну и нейминг уёбищный, конечно. Хотя бы «per_thread_request_pool[b]s[/s]» сделали…
                                      Ответить
                          • Кстати, free(&per_thread_request_pool[0]) можно написать в этом случае?
                            Ответить
                            • > &per_thread_request_pool[0]
                              Можно, но не нужно, это то же самое, что и просто «per_thread_request_pool» (если мы про «C», конечно).
                              С точки зрения корректности вызова — во free() нужно передавать исключительно то, что вернули malloc()/calloc() (кроме NULL, офк).
                              UPD: оказывается по Стандарту, во free() вполне себе можно передавать NULL.
                              Ответить
                  • Это не страшно, если pinba_error роняет всю систему.

                    Меня больше пугает, что пула два, и знание об их количестве не вынесено никуда.

                    Значит, в коде есть явно два free, например. Когда их станет три, в одном из пяти мест наверняка забудут поправить
                    Ответить
                    • Конечно, есть:

                      https://github.com/tony2001/pinba_engine/blob/99ca84d4b6ad77301533e3eb19dea1282f60d456/src/main.cc#L302
                      Ответить
                      • чивочиво??11
                        пул пулов чтоли?

                        for (i = 0; i < thread_pool_size; i++) {
                        		pinba_pool_destroy(D->per_thread_request_pool[0] + i);
                        		pinba_pool_destroy(D->per_thread_request_pool[1] + i);
                        		pinba_pool_destroy(D->per_thread_tmp_pool + i);
                        	}
                        Ответить
                      • еще это знание есть тут
                        https://github.com/tony2001/pinba_engine/blob/99ca84d4b6ad77301533e3eb19dea1282f60d456/src/pinba_types.h#L315
                        Ответить
                        • АнтиООПшники должны быть в экстазе от этих портянок
                          Ответить
                          • Так оно во вполне себе ООПэшном стиле насрано.
                            Ответить
                          • Копипаст знания это всегда говно: что с ООП, что без.

                            зы: ахахах, нейминг прикольный, и копипаст полей. Да, с ООП можно было бы наследоваться, но можно было бы и без него (на худой конец сделать делегацию)
                            Ответить
                        • А вот эти pinba_report1_data...pinba_report18_data это типа такая поддержка версионирования?
                          Ответить
                          • Думаю, что это "наследование" (ну или расширение).

                            Сравни две даты: видишь, у второй есть доп поле?
                            struct pinba_report8_data { /* {{{ */
                            	void *histogram_data;
                            	size_t req_count;
                            	struct timeval req_time_total;
                            	struct timeval ru_utime_total;
                            	struct timeval ru_stime_total;
                            	double kbytes_total;
                            	double memory_footprint;
                            	int status;
                            };
                            /* }}} */
                            
                            struct pinba_report9_data { /* {{{ */
                            	void *histogram_data;
                            	size_t req_count;
                            	struct timeval req_time_total;
                            	struct timeval ru_utime_total;
                            	struct timeval ru_stime_total;
                            	double kbytes_total;
                            	double memory_footprint;
                            	int status;
                            	char script_name[PINBA_SCRIPT_NAME_SIZE];
                            };
                            Ответить
                            • Та больше похоже на разные версии, которые используются в разных местах апишки.

                              Правда, некоторые ничем не отличаются, первая и вторая, вроде.
                              Ответить
                              • Судя по «pinba_regenerate_reportN» в https://github.com/tony2001/pinba_engine/blob/master/src/pinba_regenerate_report.h — это разные типы отчёта с разными данными.
                                Ответить
                                • > This file is autogenerated
                                  - это немного успокаивает.
                                  Ответить
                                  • конечно.

                                    Но вот этот-то нет
                                    https://github.com/tony2001/pinba_engine/blob/99ca84d4b6ad77301533e3eb19dea1282f60d456/src/pinba_types.h
                                    Ответить
                            • Кстати, вся эта история учит нас важному: успех продукта весьма слабо связан с качеством программистов (и, как следствие, программного кода).

                              Стайка пыхомакак вполне может сделать на коленке проект, который будет иметь сотни тысяч пользователей и приносить семизначные прибыли его создателям.

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

                      Главное правило сишника: насрал — убери за собой.
                      Ответить
                      • >насрал — убери за собой.
                        Да я-то согласен. Лучше выработать жетские концепции типа "функция InitFoo выделила память, значит должна быть DestroyFoo".

                        А если думать "в каждом конкретном случае" , то легко можно серануться
                        Ответить
              • Кстати, этот Тони случайно не является тем самым загадочным единственным сишником из «Баду»?
                Ответить
                • Ну видимо да, кажется что больше других сишников там нет.

                  на самом деле тоня -- пыхер (и чуть ли не отец-аснавтель пхпклуба), но вот немного умеет си тоже. Особенно аллоцировать память
                  Ответить
                  • Именно поэтому я за «PHP».
                    Ответить
                  • Я невнимательно прочитал.

                    «Единственный сишник» –— это «einstein_man», в миру «Антон Поваров».

                    А «tony2001» в миру «Антон Довгаль» (у них вообще есть неантоны?). Да, пыхер:
                    https://www.facebook.com/antony.dovgal
                    Ответить
                    • P.S. «Pinba» первая была написана Довгалем, а «Pinba2» — Поваровым.
                      Ответить
                    • >einstein_man
                      Всегда уважал в людях скоромность
                      Ответить
              • Тоня еще писатель полезных утилиток
                struct eqstr {
                	bool operator()(const char *s1, const char *s2) const {
                		return (s1 == s2) || (s1 && s2 && strcmp(s1, s2) == 0);
                	}
                };
                
                struct xxhash {
                	size_t operator()(const char* str) const {
                		int str_len = strlen(str);
                		return XXH64(str, str_len, 2001);
                	}
                };




                А так же поборник типобезопасности
                void *pinba_map_add(void *map_report, const char *index, const void *data) /* {{{ */
                {
                	pinba_map *map;
                	if (map_report == NULL) {
                		map = new pinba_map();
                	} else {
                		map = static_cast<pinba_map*>(map_report);
                	}
                	map->data_add(index, data);
                
                	return map;
                }
                Ответить
    • Жопорукие, даже пасхалку не могут сделать нормально!
      Ответить
    • Хуй, ня!
      Ответить
    • Можно поискать хуйню по запросу "ХуЙнЯ".
      Ответить
    • <?php
       
      $search_text = 0;
       
      if ($search_text=="хуйня") {
      			echo "У нас серьезная компания и мы всякой хуйни на сайте не держим.";
      }


      Угадайте, что выведет программа и почему я за «PHP».

      Спойлер:
      https://ideone.com/wGgwj8
      Ответить
      • else {
            $result.="Вы искали: <u><b>".$input->search_text."</b></u><br><br>";
            $result.="И нихуя не нашли.";
        }
        Ответить
        • <u><b> - это теги undefined behavior для PHP?
          Ответить
          • <u><b></u></b>
            Ответить
          • Это два депрекейтед тага
            Ответить
            • С депрекейшном в «HTML» всё плохо: там таги то депрекейтят, то возвращают.

              <i><b><u><s> комитету не понравились тем, что они несемантические. Мол, представление будем описывать в CSS (font-weight:bold и т. п.), а в HTML — только семантику. А семантические таги — это <em><strong><ins><del>, которые подчёркивают важность информации.

              По факту же в вебе сплошь и рядом используют несемантические <div> и <span>, а семантические <article>, <aside> и т. п. редко вспоминают.
              Ответить
              • да, семантика обосралась

                регулярно ввижу класы типа red-button и col-3
                Ответить
                • Бывает и хуже. Например, в «Твитторе»:
                  <div class="css-1dbjc4n r-1j3t67a"><div class="css-1dbjc4n r-18u37iz r-thb0q2"><div class="css-1dbjc4n r-1iusvr4 r-16y2uox r-5f2r5o r-m611by"></div></div><div class="css-1dbjc4n r-18u37iz r-thb0q2 r-1mi0q7o" data-testid="tweet"><div class="css-1dbjc4n r-1awozwy r-18kxxzh r-5f2r5o" style="flex-basis: 49px;"><div class="css-1dbjc4n r-18kxxzh r-1wbh5a2 r-13qz1uu">
                  Ответить
                  • P.S. Вот, например, если я хочу, чтобы в «Твитторе» аватарки были не круглыми, а квадратными, я добавляю в user.css правило:
                    .r-sdzlij {border-radius: 0 !important;}

                    Очевидное название класса, да?

                    P.S. Исправил. Я сначала указал класс «r-t23y2h» — это для твитов с картинками. Для аватарок используется класс «r-sdzlij».
                    Ответить
                    • UI твитора наверняка генерится автоматически, руками это говно никто не пишет.
                      Ответить
                      • надо ли говорить, что по ряду причин рандомные идентификаторы делают только пидоры
                        Ответить
                      • Зато представь, сколько софта для генерации написано, сколько промежуточных уровней абстракции, сколько специалистов по этой хуете, сколько рабочих мест.

                        Меня тут больше пугают не названия классов, а несколько классов у одного дива: <div class="css-1dbjc4n r-1iusvr4 r-16y2uox r-5f2r5o r-m611by">

                        Зачем? Зачем? Это так же ужасно, как <div class="color-red weight-bold margin-5 with-border">.
                        Ответить
                        • Генерация и автоматизация намекают, что рабочие места скорее были сокращены.
                          Ответить
      • Э-э-э... строка "хуйня" для сравнения автоматически преобразовывается в числo?
        Ответить
        • Какая хуйня )))
          Ответить
        • Так точно!

          Именно поэтому я боюсь == в «PHP». Лучше перебдеть и поставить === , чем перебздеть.

          Была дыра в каком-то форумном движке, позволявшая входить в учётки по неправильному паролю, потому что хэши сравнивались через == .
          Ответить
          • 0eЛЮБЫЕСИМВОЛЫ?
            Ответить
            • Типа того. Я даже в кишках интерпретатора «PHP» покопался, чтобы понять, как это работает.

              https://www.citi.io/wp-content/uploads/2018/03/2566-01.jpg
              Ответить
            • Нашёл упоминание этого багра:
              https://govnokod.ru/17118#comment254919

              Нашёл другой багор:
              https://govnokod.ru/25336#comment489975

              Мы ж ещё какие-то багры обсуждали с упоминанием форумных движков, но я не могу придумать, как нагуглить.
              Ответить
            • Ещё кое-что:
              https://govnokod.ru/18191#comment286615
              Ответить
      • а зачем сравнивать строку с числом, да еще и через == ?
        Ответить
        • В «PHP» никогда нельзя быть уверенным, что и с чем ты сравниваешь.
          https://ideone.com/xom4hB
          Ответить
          • В «PHP» и в «JavaScript» лучше никогда не использовать «==«.
            Ответить
          • Можно, если принудительно приводить к нужному типу и объявлять типы в сигнатуре. Ну и лучше пользоваться "===" а про "==" забыть.
            Ответить
            • https://ideone.com/w5n0md
              Чем мне тут помогли пыхоприведение и хвалёные пыхосигнатуры? Я трижды сказал ебучему шаблонизатору, что хочу сравнить строки, но нет, шаблонизатор, блять, умнее, ему лучше знать, что с чем я хотел сравнивать.
              Ответить
              • никогда
                никогда
                никогда не используй == в JS и PHP
                Ответить
    • Было бы круто, если бы они применили мышиное обучение и показали именно ту хуйню, которую я и искал, но забыл название.
      Ответить
      • В их случае, думаю, проще было бы нанять экстрасенса для поиска хуйни по запросу.
        Ответить
    • ко кой роритет
      https://en.wikipedia.org/wiki/DJGPP
      Ответить
      • Я им даже пользовался. А до этого пользовался EMXGCC.

        В DJGPP v 2.04 появилась даже функция popen. Правда, работала она только для программ, которые написаны на нём же.
        Ответить

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