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

    +158

    1. 1
    <<?='b'.'o'.'d'.'y'?> class="p0 m0">

    Чье-то из какой-то самописной CMS в шаблоне..) таким способом выводятся многие теги))

    Запостил: Cyril, 22 Мая 2014

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

    • н.о. .З.а.ч.е.м?
      Ответить
      • 'О'.'б'.'ф'.'у'.'с'.'к'.'а'.'ц'.'и'.'я'. '?'
        Ответить
        • 'З'.'а'.'щ'.'и'.'т'.'а'.' '.'о'.'т'.' '.'п'.'о'.'и'.'с'.'к'.'а'.' '.'п'.'о'.' '.'ф'.'а'.'й'.'л'.'а'.'м'.'?'

          Надо userjs такой забабахать.
          Ответить
          • > Защита от поиска по файлам?
            Боль в жопе для того, кому потом это поддерживать. И ведь он всяко писал это руками, а не делал скрипт-обфускатор.
            Ответить
    • Аналог '</scr'+'ipt>' в JS?
      Ответить
    • Напомнило:

      -  } elsif ($origin eq "Ubuntu" or $origin eq "Canonical") {
      +  } elsif ($origin=~/^[u][b][u][n][t][u]$/ or $origin eq "Canonical") {
           if ($suite) {
      -      say("Ubuntu Release file: using Suite ($suite).");
      +      say("Debian derivative from Canonical which cannot be named Release file: using Suite ($suite).");
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • Странные люди. Я бы написа́л:
        if((uint16_t *)p[0] == 0x6570 && p[2] == 't')
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • Я приоритеты не помню. Надо было поставить скобки?

            Тогда так: ((uint16_t *)p)[0] == 0x6570.
            Или так: 0[(uint16_t *)p] == 0x6570.
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • И для выравнивания, если проц не умеет читать слова по кривым оффсетам.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                • Нахуя тогда байты адресовать, а не слова?
                  Ответить
                  • Байты то можно читать по нечётным адресам.
                    Ответить
                  • Кстати в "DRAM" таки адресуются слова (на её шине данных, не процессорные). А байты для записи можно выбрать через линии byte enable. Т.е. байтовая адресация один хер эмулируется.
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • Не совсем так.

                        Ширина строки (и количество усилителей) на порядок больше количества пинов под данные. После активации строки (долго) ты можешь читать и писать любые места в этой строке (быстро). На SDRAM эти обращения пайплайнятся и хуярят на частоте шины (те самые 3ГГц).

                        А ширина модуля действительно совпадает с суммарной шириной чипов. И сейчас там вроде намного больше 64...
                        Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • Там ещё банки внутри самих чипов. И пока один банк на перезарядке ты можешь читать из второго и открывать третий (interleaving).

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

                            А дополнительные планки увеличивают либо ширину шины либо тупо объём памяти. Смотря как воткнёшь.
                            Ответить
                      • З.Ы. Ну и byte enable нужен чтобы не писать на всю ширину модуля если тебе нужно поменять всего один байт (на DDR и выше - чтобы не писать на 2-4 ширины модуля, лол).
                        Ответить
              • >> правда твой код специфичен для байтордера

                А ещё мне нравятся нестандартные литералы, когда в одинарных кавычках несколько символов. Даже на одном процессоре с известным индейцем в разных кокококомпиляторах они реализованы по-разному. В одних 'abcd' кококомпилируется в db 61h, 62h, 63h, 64h, в других –— в db 64h, 63h, 62h, 61h. Ну то есть в одних 'abcd' –— это 0x61626364, в других —– это 0x64636261.
                Ответить
                • А "tcc" воспринимает только первый символ, а остальные игнорирует :(
                  '0123' == 0x30
                  Ответить
                  • #include <stdio.h>
                    int main() {
                        printf("%x\n", '0123');
                        return 0;
                    }


                    • «gcc» выдаёт: «warning: multi-character character constant [-Wmultichar]»
                    Спокойно компилирует, программа выводит 30313233 (т. е. на первом месте самый старший байт).
                    • «clang», «Watcom C», «Digital Mars», «MSVC», «Intel Compiler» даже ворнинг не выдали.
                    Программа выводит 30313233.
                    • «Borland C» компилирует без ворнингов.
                    Программа выводит 33323130 (т. е. байты размещаются так же, как в строке).
                    • «tcc» выводит ворнинг (multi-character character constant), но, как уже заметил очередной петух, воспринимает только первый символ. «Pelles C» ведёт себя точно так же.
                    • Церновский интерпретатор «CINT» без ворнингов выводит 30.
                    • Интерпретатор «Ch» указывает на синтаксическую ошибку и прерывает трансляцию.

                    Интересно было бы проверить какие-нибудь компиляторы на большом индейце.
                    Ответить
                    • Зашёл на «godbolt.org».
                      «gcc» на «Power PC» и на «MIPS» выполняет операцию 0x30310000 | 0x3233, т. е. собирает число 0x30313233.

                      На «AVR» тот же компилятор собирает число 0x3233, т. е. воспринимает только два младших байта (два последних).

                      В общем, вне зависимости от порядка байтов процессора «gcc» воспринимает константу как записанную в большом индейце, а потом обрубает до размера мышиного слова.
                      Ответить
                    • • «LCC» компилирует без ворнингов, выводит 33323130, как и «Borland».
                      • «Orange C» прерывает компиляцию с сообщением: «Unterminated character constant in function main».
                      • «IBM Visual Age» компилирует без ворнингов, выводит 30313233, как «мейнстримные» компиляторы.
                      Ответить
                    • Офтопик. Смотрите, что нашёл:
                      http://compcert.inria.fr/

                      Компилятор «C», написанный на «OCaml»+«coq», с формально доказанной корректностью.

                      «The CompCert project investigates the formal verification of realistic compilers usable for critical embedded software. Such verified compilers come with a mathematical, machine-checked proof that the generated executable code behaves exactly as prescribed by the semantics of the source program. By ruling out the possibility of compiler-introduced bugs, verified compilers strengthen the guarantees that can be obtained by applying formal methods to source programs.

                      The main result of the project is the CompCert C verified compiler, a high-assurance compiler for almost all of the C language (ISO C99), generating efficient code for the PowerPC, ARM, RISC-V and x86 processors.»
                      Ответить
                      • CompCert C supports all of ISO C 99, with the following exceptions:
                        switch statements must be structured as in MISRA-C; unstructured "switch", as in Duff's device, is not supported.
                        longjmp and setjmp are not guaranteed to work.
                        Variable-length array types are not supported.

                        Ну его нахуй, самые классные пльушке выпилили.
                        Ответить
                        • Кстати, собрал его. Проверяю тот самый пример –— компилируется без ворнингов, программа выводит 30313233, как «мейнстримные» компиляторы. Даже скучно.
                          Ответить
                          • Промежуточный выхлоп компилятора:
                            -------------- Initial XTL
                            
                            f() {
                                6:	
                                5:	x2 = __stringlit_1 + 0 (int); 
                                4:	x3 = 808530483; 
                                3:	(Oi1, Oi0) = (x3, x2) using x6, x5; EAX = call "printf"(Oi0, Oi1); 
                                2:	x4 = 0; 
                                1:	EAX = x4; return EAX
                            }
                            
                            ------------------ Unspillable variables --------------
                            
                            x6 x5 
                            
                            -------------- After initial register allocation
                            
                            f() {
                                6:	
                            { }
                                5:	x2{EAX} = __stringlit_1 + 0 (int); 
                            { x2 }
                                4:	x3{ECX} = 808530483; 
                            { x3 x2 }
                                3:	(Oi1, Oi0) = (x3{ECX}, x2{EAX}) using x6{EDX}, x5{XMM0}; EAX = call "printf"(Oi0, Oi1); 
                            { }
                                2:	x4{EAX} = 0; 
                            { x4 }
                                1:	EAX = x4{EAX}; return EAX
                            { }
                            }
                            
                            -------------- Candidate allocation
                            
                            f() {
                                6:	
                                5:	EAX = __stringlit_1 + 0 (int); 
                                4:	ECX = 808530483; 
                                3:	outgoing(1,int) = ECX; outgoing(0,int) = EAX; call "printf"; 
                                2:	EAX = 0; 
                                1:	return
                            }


                            Описание программы на «ML»:
                            var "__stringlit_1" readonly {int8 37,int8 48,int8 52,int8 120,int8 10,int8 0}
                            extern "printf" = extern "printf" : int -> int
                            "main"() : int
                            {
                              "printf"("__stringlit_1", 808530483) : int -> int -> int;
                              return 0;
                              return 0;
                            }


                            Ещё какое-то внутреннее представление:
                            main() {
                            	EAX = __stringlit_1 + 0 (int)
                            	ECX = 808530483
                            	stack(4, int) = ECX
                            	stack(0, int) = EAX
                            	call "printf"
                            	EAX = 0
                            	return
                            }
                            Ответить
                          • Так CompCert гарантирует только отстуствие багов в компиляторе*, а не в твоём коде.
                            * Точнее, что в нём нет отклонений от формальной спецификации
                            Ответить
                            • А компилятор крестов можно сделать на петухе*? Или это невозможно, потому что крестошаблоны тяжело описать?

                              * «coq» = «петух» в переводе с французского.
                              Ответить
                              • Крестошаблоны как раз несложно должно быть описать (они ж по сути просто функциональный язык из буханки сладкого хлеба), а вот какие-нибудь исключения...
                                Ответить
                                • Исключения можно свести к Either.

                                  Вся эта хуйня с unwind'ами - просто оптимизация успешного пути.
                                  Ответить
                                  • Проблема в том, что в семантику добавляется недетерминированность (сразу в 2 раза больше доказательств) и контекст (catch в крестах это вам не runEitherT). Проще всего это, наверное, продолжениями смодеровать.
                                    Ответить
                                    • *смоделировать, чортов телефон
                                      Ответить
                                    • показать все, что скрытоvanished
                                      Ответить
                                      • > Как вообще можно использовать в продакшене программу если ты не можешь математически доказать её корректность?

                                        Такой уровень корректности нужен в малом количестве мест. Недаром сейчас "AI" так популярен: работает в 70% случаев и ладно.

                                        > Почему строители моста могут математически показать что мост не упадет, а программисты не могут?

                                        Даром что в 2018 как минимум два крупных моста разрушились, во Флориде (там чисто инженерный факап) и в Италии (старость + неудачная конструкция).
                                        Ответить
                                        • Моделирование механических систем вообще интересно.

                                          Кто-нибудь наверняка вспомнит про сопромат.

                                          Сопромат основан на двух гипотезах:
                                          1. Линейная упругость материала (механическое напряжение пропорционально удлинению).
                                          2. Гипотеза плоских сечений. Грубо говоря, это когда частицы просто смещаются, но ещё не поворачиваются.

                                          Реальные конструкции, пользуясь одним сопроматом, не рассчитаешь.

                                          Невыпуклые углы конструкций являются концентраторами напряжений, в них могут начаться пластические деформации или рост трещин.

                                          При больших деформациях описывать геометрическое состояние конструкции уже не так просто (гугли подходы Эйлера и Лагранжа).

                                          Приходится дополнительно исследовать упругие свойства материала (нелинейная упругость, градиентная упругость, несимметричная упругость) и неупругие (эффект Баушингера –— раскрытие невидимых микротрещин при деформации, ползучесть, усталость).

                                          Потом вспоминаем, что нагрузка имеет нерегулярный характер (на него может заехать больше транспорта, чем планировалось), что на мост действует окружающая среда, что материалы могут оказаться с браком, что при возведении могут быть погрешности, что грунт может подвести...

                                          *****

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

                                          Что же произошло в 2018 году, из-за чего разрушение не смогли предотвратить?
                                          Ответить
                                          • Вроде бы во Флориде как раз таки одну из post-stressing арматурин перетянули до пластической деформации.
                                            Чем кончилось расследование в Италии я не следил, но мост был старый, а архитектор был выебщиком, у которого любимым развлечением было "а как бы сделать поменьше опор". В итоге ремонт его мостов был проблематичен (redundancy-то нет), ну на него и забили.
                                            Ответить
                                            • Мосты с минимальным количеством опор выглядят круто, но это получается аналог единственной точки отказа.
                                              Ответить
        • Царский код, с заточкой под конкретные платформы.
          Ответить

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