1. Си / Говнокод #26801

    +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
    /* meta */
    typedef struct r_anal_meta_item_t {
    	ut64 from;
    	ut64 to;
    	ut64 size;
    	int type;
    	int subtype;
    	char *str;
    	int space;
    } RAnalMetaItem;
    
    typedef struct {
    	struct r_anal_t *anal;
    	int type;
    	int rad;
    	SdbForeachCallback cb;
    	void *user;
    	int count;
    	struct r_anal_type_function_t *fcn;
    } RAnalMetaUserItem;
    
    typedef struct r_anal_range_t {
    	ut64 from;
    	ut64 to;
    	int bits;
    } RAnalRange;
    
    #define R_ANAL_UNMASK_TYPE(x) (x&R_ANAL_VAR_TYPE_SIZE_MASK)
    #define R_ANAL_UNMASK_SIGN(x) (((x& R_ANAL_VAR_TYPE_SIGN_MASK)>> R_ANAL_VAR_TYPE_SIGN_SHIFT)==R_ANAL_VAR_TYPE_UNSIGNED)?0:1
    
    #define R_ANAL_GET_OFFSET(x,y,z) \
    	(x && x->binb.bin && x->binb.get_offset)? \
    		x->binb.get_offset (x->binb.bin, y, z): -1
    enum {
    	R_ANAL_DATA_TYPE_NULL = 0,
    	R_ANAL_DATA_TYPE_UNKNOWN = 1,
    	R_ANAL_DATA_TYPE_STRING = 2,
    	R_ANAL_DATA_TYPE_WIDE_STRING = 3,
    	R_ANAL_DATA_TYPE_POINTER = 4,
    	R_ANAL_DATA_TYPE_NUMBER = 5,
    	R_ANAL_DATA_TYPE_INVALID = 6,
    	R_ANAL_DATA_TYPE_HEADER = 7,
    	R_ANAL_DATA_TYPE_SEQUENCE = 8,
    	R_ANAL_DATA_TYPE_PATTERN = 9,
    };
    
    // used from core/anal.c
    #define R_ANAL_ADDR_TYPE_EXEC      1
    #define R_ANAL_ADDR_TYPE_READ      1 << 1
    #define R_ANAL_ADDR_TYPE_WRITE     1 << 2
    #define R_ANAL_ADDR_TYPE_FLAG      1 << 3
    #define R_ANAL_ADDR_TYPE_FUNC      1 << 4
    #define R_ANAL_ADDR_TYPE_HEAP      1 << 5
    #define R_ANAL_ADDR_TYPE_STACK     1 << 6
    #define R_ANAL_ADDR_TYPE_REG       1 << 7
    #define R_ANAL_ADDR_TYPE_PROGRAM   1 << 8
    #define R_ANAL_ADDR_TYPE_LIBRARY   1 << 9
    #define R_ANAL_ADDR_TYPE_ASCII     1 << 10
    #define R_ANAL_ADDR_TYPE_SEQUENCE  1 << 11
    
    #define R_ANAL_ARCHINFO_MIN_OP_SIZE 0
    #define R_ANAL_ARCHINFO_MAX_OP_SIZE 1
    #define R_ANAL_ARCHINFO_ALIGN 2
    #define R_ANAL_ARCHINFO_DATA_ALIGN 4

    Как нужно называть идентификаторы.

    Источник:
    https://github.com/radareorg/radare2/

    Запостил: TEH3OPHblu_nemyx, 11 Июля 2020

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

    • SEO-пост.

      https://github.com/radareorg/radare2/blob/master/libr/anal/anal.c

      Метки: #radare2, #anal, #naming, #reverse-engineering, #forensics, #security, #binary-analysis, #malware-analysis, #disassembler.
      Ответить
      • #goatse
        Ответить
        • Царь в кернеле! Ура!!!

          drivers/tty/serial/sunsab.h
          u8	tsar;		/* Time-Slot Assignment Reg. Receive	*/
          
          /* Time Slot Assignment Register Receive (TSAR) */
          #define SAB82532_TSAR_TSNR_MASK		0xfc
          Ответить
      • Запушил коммит в твой anal, проверяй.
        Ответить
        • У них ещё коллекция дизассемблеров весело называется:
          https://github.com/radareorg/radare2/tree/master/libr/anal/p
          Ответить
          • https://radare.gitbooks.io/radare2book/analysis/code_analysis.html
            >>> You can find them in anal
            Ответить
            • Ну хотя бы по-честному признались, что конфиг в задницу спрятали.
              Ответить
              • Я больше орнул с «анальной руки».

                libr/anal/p/anal_arm.c
                Ответить
                • libr/anal/p/anal_arm_hacks.inc

                  Анальная расчленёнка топором.
                  Ответить
                  • Очень эпично выглядит комит про рукожопие в репе ДжинВенХуй93.
                    jinwenhui93/radare2
                    commit: Enable anal.arm 
                    https://github.com/jinwenhui93/radare2/commit/5fde01a957f043328e9da9100d316603d1429b92
                    Ответить
        • Внезапно нашлись комиты в кернел, где в выражениях никогда не стеснялись.

          Hugh Dickins authored and Linus Torvalds committed on Oct 30, 2005
          
           [PATCH] mm: tlb_finish_mmu forget rss
          
          Remove the mmu_gather's freed field, let tlb_finish_mmu stick to its own
          business, just decrement the rss mm_counter in zap_pte_range (yes, there was
          some point to batching the update, and a subsequent patch restores that).  And
          forget the anal paranoia of first reading the counter to avoid going negative
          - if rss does go negative, just fix that bug.
          
          Remove the mmu_gather's flushes and avoided_flushes from arm and arm26: no use
          was being made of them.  But arm26 alone was actually using the freed, in the
          way some others use need_flush: give it a need_flush.  arm26 seems to prefer
          spaces to tabs here: respect that.
          
          Signed-off-by: Hugh Dickins <[email protected]>
          Signed-off-by: Andrew Morton <[email protected]>
          Signed-off-by: Linus Torvalds <[email protected]>
          Ответить
      • Красиво
        R_API bool r_anal_set_bits(RAnal *anal, int bits) {
        	switch (bits) {
        	case 8:
        	case 16:
        	case 27:
        	case 32:
        	case 64:
        Ответить
        • https://oeis.org/A246549
          >>> Prime powers p^e where p is a prime and e >= 3 (prime powers without 1, the primes, or the squares of primes).
          >>> 8, 16, 27, 32, 64, 81, 125, 128, 243, 256, 343, 512, 625, ...
          Ответить
    • > R_ANAL_ARCHINFO

      R_ANAL_ARCHINHO
      Ответить
    • >master/libr/anal/anal.c
      >struct r_anal_meta_item_t
      Шутка про double penetration;
      Ответить
    • * Some anal retentivity here: even if both 'struct
       * uwb_{dev,mac}_addr' have the actual byte array in the same offset
       * and I could just pass _addr to hwarc_cmd_dev_addr_mgmt(), I prefer
      
      #define VS6624_DIRECT_ANAL_GAIN_MSB   0x119D /* analog gain for Direct Mode MSB */
      #define VS6624_DIRECT_ANAL_GAIN_LSB   0x119E /* analog gain for Direct Mode LSB */


      Там очень много:
      https://github.com/torvalds/linux/search?q=anal&unscoped_q=anal
      Ответить
      •  	/* Totally anal locking here... */
        	spin_lock(&journal->j_list_lock);


        https://github.com/torvalds/linux/blob/master/fs/jbd2/journal.c

         	fpdis_exit2:
        	wr		%g7, 0, %gsr
        	ldx		[%g6 + TI_XFSR], %fsr
        	rdpr		%tstate, %g3
        	or		%g3, %g4, %g3		! anal...
        	wrpr		%g3, %tstate
        	wr		%g0, FPRS_FEF, %fprs	! clean DU/DL bits
        	retry


        https://github.com/torvalds/linux/blob/master/arch/sparc/kernel/fpu_traps.S

        Похоже, что разработка ядра — нелёгкое дело.
        Ответить
        • Интересно, что у SPARC'а инструкция OR трёхместная: можно указать и регистры обоих аргументов, и регистр назначения. А ещё у него есть инструкция XNOR. Это XOR + NOT ?
          Ответить
          • XOR + NOT — это же тупое равенство, разве нет?
            0 == 0 | 1
            0 == 1 | 0
            1 == 0 | 0
            1 == 1 | 1


            >инструкция трёхместная
            RISC же
            Небольшое число простых инструкций, обилие регистров, трехместные комманды, всё это отличало риски.
            Ответить
            • > XOR + NOT — это же тупое равенство, разве нет?
              Я слышал, железячники вообще любят ко всем операциям букву «N» добавлять. «NAND», «NOR», «XNOR».
              Ответить
              • В ТТЛ базовым элементом является И-НЕ (NAND), а в КМОП (CMOS) базовым элементом является ИЛИ-НЕ (NOR). Все остальные логические элементы (AND, OR, XOR) лепили из нескольких базовых. Отсюда и любовь к букве «N».

                Была ещё ЭСЛ, в которой базовый элемент выдавал сразу два сигнала: ИЛИ (OR) и ИЛИ-НЕ (NOR). Схема была такая, что комплементарный результат можно было получить почти бесплатно.
                Ответить
              • >«NAND», «NOR»
                Так это 2 элемента, кобенируя которые можно собрать все остальные операции.

                Минимально необходимый и достаточный базис. Такой же как двоичная система или тьюринг-полные вещи вроде brainfuck, movfuskator.

                N* они любят поскольку подавая на оба входа один и тот же сигнал получаем инвертор.

                С помощью инвертора из NAND получается AND, а из NOR=>OR.

                А благодаря правилу Де-Моргана из ANDa делается OR и наоборот.

                После чего лепится произвольная логика в КНФ/ДНФ.
                Ответить
                • Называется «полная система».
                  Ответить
                • Хочу язык программирования, где будут только nand и nor. Пишущий на нем имеет шансы неплохо прокачать внимательность
                  Ответить
                  • Зачем тебе и nor и nand? Любого из них достаточно для реализации любой логики.
                    Ответить
                    • И правда
                      Шеффер же доказал. Тогда еще лучше
                      Ответить
                  • Накидай по быстрому лисп-подобный, на перле.
                    Ответить
                  • Были шутки про какого-то гугловского чела, у которого на калькуляторе только одна кнопка: NAND.
                    Ответить
                    • Надо ещё константу 0 хотя бы. А то над чем операции то делать?

                      Ну или константу с неопределенным значением чтоб веселее было. Тоже должно прокатить.
                      Ответить
                      • Это как
                        Ответить
                        • Ну типа там или 0 или 1 по рандому.

                          Ты можешь написать (x nand x) nand x чтобы получить единичку при любом х.
                          Ответить
                          • Это ещё с хуя ли? Nand это же штрих шеффера?
                            Ответить
                          • Тогда x | x = -x, а не единица
                            Ответить
                          • Ну да. Там такая идея, что nandом можно вывести любую таблицу истинности в т.ч.
                            true
                            1 1
                            1 1

                            false
                            0 0
                            0 0
                            Ответить
                            • Чо это за таблицы такие?
                              Ответить
                              • Карты карно, просто без хедеров т.к. они тут очевидны.
                                Ответить
                              • питушня для удобной визуализации сложных функций
                                Ответить
                                • Не столько визуализации, сколько оптимизации.
                                  Ответить
                                  • дык чтобы что-то оптмизировать, надо это сначала увидеть, нет?
                                    Ответить
                                    • Используй воображение https://miro.medium.com/max/700/1*L1vr5-ROLPbL2wpACKWluw.jpeg
                                      Ответить
                      • А вот соврал я.

                        https://pbs.twimg.com/media/EK1Y4kQUEAA2pOr?format=png&name=360x360

                        >Ну или константу с неопределенным значением чтоб веселее было.
                        Получается jeff dean — лалка. Настоящим пацанам на калькуляторе 1 и 0 не нужны.
                        Ответить
                        • >> Jeff Dean's calculator.

                          А промежуточные результаты на листочке бумаги записывать? Если бы у этого калькулятора были хотя бы кнопки MS/MR...
                          Ответить
                          • >хотя бы кнопки MS/MR...
                            Лучше PUSH и POP.
                            Ответить
                            • У стековых микрокалькуляторов была ещё кнопка вращения стека и кнопка обмена двух верхних ячеек стека:
                              https://ru.wikipedia.org/wiki/Электроника_МК-52
                              https://ru.wikipedia.org/wiki/Электроника_МК-61
                              https://ru.wikipedia.org/wiki/Электроника_Б3-34

                              Кружочек — это вращение (обычно нажималась после кнопки «F», потому что отдельной физической кнопки не было), две стрелочки или XY — это обмен двух ячеек стека.

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

                              У моделей последнего поколения стековых калькуляторов была ещё операция «Bx» — восстановление предыдущего значения верхней ячейки стека. Появился специальный регистр, который перед любыми арифметическими операциями сохранял значение верхней ячейки.
                              Ответить
                              • Кстати, советские стековые микрокалькуляторы, вероятно, были созданы под впечатлением от «Хули Паккард»:
                                https://en.wikipedia.org/wiki/HP-19C/-29C
                                https://en.wikipedia.org/wiki/HP-35
                                https://en.wikipedia.org/wiki/Hewlett-Packard_Voyager_series

                                «HP» вообще дальше всех продвинулся в этом направлении. Мало того, что они выпустили стековые калькуляторы со встроенным принтером, они ещё дошли до графических дисплеев:
                                https://en.wikipedia.org/wiki/HP_48_series

                                Навороченный микрокалькулятор, у которого нет клавиши «равно», зато есть клавиша «PUSH» (у «HP» она называется «ENTER»).

                                Кто-нибудь ещё в мире производил что-то подобное? «Вика» упоминает только «Комодор», «Синклер» и какие-то малоизвестные компании (судя по описанию, синклеровский стековый калькулятор — вообще тупая фигня).
                                Ответить
                  • Да что уж nand. Вон была игрушка от zachtronics где надо было рисовать полоски кремния с p и n проводимостями.
                    Ответить
                    • И что этой игрушкой можно было моделировать? Насколько адекватная в ней была физическая модель?
                      Ответить
                      • Сходи поиграй, если флеш еще не удалил. KOHCTPYKTOP называется.

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

                        Но в последних заданиях на основе этого довольно сложные микросхемы получаются.

                        З.Ы. Раз nand можно нарисовать - значит можно все.
                        Ответить
                        • Спасибо.

                          Посмотрел демку. Ничего не понял. Как они «N» на «P» переключили?

                          P.S. Уже понял: Shift.
                          Ответить
                          • Ну да, управление там ебанутое немного из-за флеша.
                            Ответить
                        • Неплохо для игры, но довольно упрощённая питушня. В реальных схемах ещё ставят стабилизаторы (цепочки, нарушающие равновесие, заставляющие транзисторы открываться или закрываться полностью), потому что при последовательном соединении элементов без стабилизаторов напряжение уплывёт. Ну и ещё тут все схемы с «открытым выходом» (т. е. при логическом нуле на выходе фактически выход оторван), что тоже ограничивает их применение.
                          Ответить
                          • > открытым выходом

                            Ну я собственно про это "отсутствие GND" и писал выше. Но ради реализма пришлось бы или подтяжки лепить (nMOS) или вообще по 2 раза всё рисовать (CMOS). А там и так боль в последних задачках. Особенно где про память с произвольным доступом.

                            З.Ы. Но вообще более низкоуровневой игры я ещё не встречал :)
                            Ответить
                            • Как я понял, там можно лепить только транзисторы с изолированным затвором и встроенным каналом (поскольку полоска легированного полупроводника не прерывается), а вот с индуцированным каналом (когда канал «исток — сток» разорван) нельзя. И pn-переходы нельзя, и барьеры Шоттки нельзя (у них контакт «металл — полупроводник» почему-то получается безбарьерным), и многослойные девайсы нельзя.
                              Ответить
                              • А светодиоды можно?
                                Ответить
                                • Для светодиодов нужен арсенид галлия, а там вообще выбирать материал нельзя. Там только кремний.
                                  Ответить
              • >XNOR
                Вот XOR ральзовывать сложнее всего, поскольку карта Карно неудобная:
                0 1
                1 0

                Она никак не минимизируется. И нужно очень много элементов:
                a ⊕ b = (not (a) and b) or (a and not(b))

                Потому его выгодно хуйнуть отдельным элементом.
                Тем более что это готовый полусумматор.
                Ответить
                • Сразу видно, что ты дискретный математик из рашки.
                  Ответить
                • Перепишу:
                  a ⊕ b = (not (a) nand b) nand (a nand not(b))

                  Для реализации в TTL нужно взять 5 базовых NAND-элементов. Кажется, так их и делают, потому что с отдельной реализацией много пердолинга, чтобы совпали уровни сигнала и прочие электрические характеристики.
                  Ответить
                  • Есть хак из четырёх элементов:

                    c = a nand b
                    res = (a nand c) nand (b nand c)
                    Ответить
                    • Сразу видно, что ты математик из рашки.
                      Ответить
                    • И правда, работает.

                      c = 0, только если a = b = 1.

                      a nand c = 0, только если a = 1 И c = 1. Последнее возможно, только если b = 0.
                      b nand c = 0, только если b = 1 И c = 1. Последнее возможно, только если a = 0.

                      Итого: при a≠b хотя бы одна из скобок равна нулю, следовательно, res = 1.
                      При a=b обе скобки будут равны 1, следовательно, res = 0.
                      Ответить
                      • > и правда работает

                        Ну дык. Так можно было собрать xor из одной К155ЛА3, я даже пробовал.
                        Ответить
                  • > TTL

                    А в CMOS вроде прям как базовый элемент делают. Там нету особо проблем с этим, любую таблицу истинности пильнуть можно, почти как на реле.
                    Ответить
                  • А в FPGA вообще тупо мультиплексором из таблицы истинности ответ достают. Поэтому там любая функция до 4 аргументов одинаково реализуется (на некоторых и до 6).
                    Ответить
                    • Охуеть
                      Ответить
                      • В этой модели даже сложение не захардкожено, лол. Просто табличка разваливается на 2 - для выхода и для переноса.

                        Получается что одна ячейка может в любую функцию от четырёх бит или в джве любых функции от трёх.
                        Ответить
            • > тупое равенство

              Не тупое, а побитовое.
              Ответить
        • >разработка ядра — нелёгкое дело

          Забавно что у сишников самый ядрённый нейминг.
          Ответить
    • arch/x86/mm/extable.c
      		extern u32 pnp_bios_is_utter_crap;
      		pnp_bios_is_utter_crap = 1;
      		printk(KERN_CRIT "PNPBIOS fault.. attempting recovery.\n");
      Ответить
      • >pnp_bios_is_utter_crap

        Вот какие примеры надо Мартину в «Чистый код».
        Прочитал переменную и сразу всё понятно.
        Ответить
    • include/linux/mfd/tps65910.h
      #define TPS65910_SLEEP_SET_RES_OFF			0x44
      #define TPS65910_EN1_LDO_ASS				0x45
      #define TPS65910_EN1_SMPS_ASS				0x46
      #define TPS65910_EN2_LDO_ASS				0x47
      #define TPS65910_EN2_SMPS_ASS				0x48
      #define TPS65910_EN3_LDO_ASS				0x49
      Ответить
    • tools/perf/tests/attr.c
      #define __WRITE_ASS(str, fmt, data)					\
      		return -1;						\
      	}								\
      									\
      } while (0)
      
      #define WRITE_ASS(field, fmt) __WRITE_ASS(field, fmt, attr->field)

      enum qeth_ip_ass_cmds {
      	IPA_CMD_ASS_START	= 0x0001,
      	IPA_CMD_ASS_STOP	= 0x0002,
      	IPA_CMD_ASS_CONFIGURE	= 0x0003,
      Ответить
    • See also: https://govnokod.ru/17658
      Ответить

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