1. Assembler / Говнокод #6977

    +180

    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
    ; -------- мув в AX опкода команды UD2 --------
    CODE:004051B0         mov     al, 0Bh
    CODE:004051B2         mov     ah, 0Fh
    CODE:004051B4         xchg    al, ah
    CODE:004051B6         push    eax     ; save opcode
    CODE:004051B7         call    sub_40A1E5
    
    ; -------- вис для отладки --------
    ; если зависли, то найден дубликат (жестко, но надежно :D )
    CODE:0041C676         call    hash_FindWord
    CODE:0041C67B @@dbllock:
    CODE:0041C67B         jnc     @@dbllock ; <- если хэш найден, то висим
    
    ; -------- ну и искомый баг --------
    ; неправильный цикл поиска последнего элемента списка
    CODE:00401698 proc sub_401698
    CODE:00401698         mov     ecx, [dword_42944C]
    CODE:0040169E         jecxz   loc_4016AA
    CODE:004016A0 loc_4016A0:
    CODE:004016A0         mov     ecx, [ecx] ; ecx = next block
    CODE:004016A2         and     ecx, ecx
    CODE:004016A4         jnz     loc_4016A0
    CODE:004016A6         mov     eax, [ecx+8] ; <-- bag: ECX = 0
    CODE:004016A9         retn
    CODE:004016AA loc_4016AA:
    CODE:004016AA         mov     eax, [dword_42A58E]
    CODE:004016AF         retn
    CODE:004016AF endp

    Искал баги в борландовском компиляторе. Нашел немало забавных моментов, три выкладываю.

    Запостил: DemonId7, 17 Июня 2011

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

    • показать все, что скрытоDelphiGovno
      Ответить
    • Это не Дельфи и не Си. Исследуемый компилятор написан на чистейшем ассемблере, примерно 60000 строк исходного кода. Так что не нужно разводить холивар, все равно наши победят :D
      ps: а программисты в борланде были действительно профи, код вылизан по самое нехочу, снял бы шляпу, если бы борланд был жив.
      Ответить
      • > компилятор написан на чистейшем ассемблере
        как будто в этом есть хоть что-то хорошее
        Ответить
        • Хорошего хватает - багов мало, красивый код, оригинальная реализация сканера :D Плохое - дважды перенеся портирование (с 8-ми битных на 16-ти битные машины, а затем и на 32-х битные) компилятор успешно загнулся, хотя спрос на него остался.
          Ответить
          • тасм?
            переносить асм это значит переписывать большую часть
            Ответить
            • Такие вещи вообще то автоматизируют - для этого есть различные утилиты, начиная от Turbo Pascal и заканчивая Quick C :D
              Ответить
              • Для автоматизации ассемблера существуют переносимые высокоуровневые языки и компиляторы с них.
                Ответить
                • Далеко не всегда. К тому же не стоит недооценивать ассемблер, у него тоже есть средства "автоматизации". Примерчик для TASM:
                  Include "system.h"
                  
                  Program MacroLanguageDemo;        /* Fantasy 2/2/1990 */
                  
                  Constant
                     MaxLine = 25;
                     MaxCol  = 80;
                  
                  Var
                     boolean Shadow;
                     bytes TopX, TopY, Line = MaxLine, Column = MaxCol;
                     words i, j, a, b;
                     char key;
                  
                  procedure MacroDemo;
                  begin
                     WriteLn<'Hello Macro Language'>;
                  endproc;
                  
                  Begin
                     asm Shadow = True  \  TopX = 10  \  TopY = 5  \  key = 'F';
                     WriteLn<'Macro Language Version 2.0'>;
                     for i = 1 to 3 do
                        for j = 20 downto 19 do
                           call MacroDemo;
                        next j;
                     next i;
                     asm a = 5  \  b = 3  \  [a] += MaxLine  \  [b] -= MaxCol;
                  End_

                  А это генератор ПСЧ, на моем макроязыке:
                  VARIABLE Seed
                  VARIABLE y
                  VARIABLE z
                  VARIABLE c
                  VARIABLE t
                  CONSTANT ITER 200000000
                  CONSTANT RANGE 10000
                  
                  $COLN Randomize ; инициализация переменных генератора
                        _ GetTicks Seed ! 362436069 y ! 77465321 z
                        _ ! 916905990 t ! 13579 c ! EXIT
                  
                  $COLN UMOD ; ( u1 u2 -- u1%u2 )
                        _ SWAP U>D ROT UM/MOD DROP EXIT
                  
                  $COLN UD+  ; ( ud u -- ud )   ud = ud + u
                        _ ROT UM+ ROT + EXIT
                  
                  $COLN Rand ; ( range -- random_number )
                        _ t @ Seed @ UM*; t = 916905990 * x
                        _ c @ UD+       ; t = 916905990 * x + c
                        _ y @ Seed !    ; Seed = y
                        _ z @ y !       ; y = z
                        _ c !           ; c = t >> 32
                        _ dup z !       ; z = t & 0xffffffff
                        _ swap umod     ; return (z % range)
                        _ exit
                  
                  $COLN Gen ; ( iter -- )
                        _ ITER 0 FOR RANGE Rand . CRLF NEXT EXIT

                  Ничего не напоминает? ;)
                  Ответить
              • чо-та я сомневаюсь, что портирование кодогенератора на другой размер машинного так легко автоматизировать
                Ответить
                • Зависит от качества кода. Если писал "индус", то можно и не начинать. Опытный же кодер всегда закладывает в код резервы, на всякий случай. Если касаться тасма, то не очень сложно, код хорошо продуман. Портировали же тасм 4.1 под OS/2.
                  Ответить
                  • А насколько нужно быть опытыным кодером, чтоб заложить в ассемблерный код резервы по портированию на другую архитектуру?
                    Ответить
          • >багов мало
            компилер для своего времени был действительно неплох
            зато в интерфейсе и либах багов с головой.
            Ответить
            • Он и сейчас во многом не превзойден, просто народ не любит маны читать :D Про интерфейс не понял, а либ с ним никаких не поставлялось, Вы его спутали с кем-то другим.
              Ответить
              • я о интерфейсе продуктов ботланда, которые используют этот компилер и их говнолибах (vcl)
                Ответить
      • > снял бы шляпу, если бы борланд был жив.
        Шляпу снимают чаще перед мертвыми на похоронах.
        Ответить
        • Ну дык де юре похорон не было, было "лишь" перевоплощение :D
          Ответить
          • Борланд не мёртв, он просто так пахнет?
            Ответить
            • пахнет жареным воздухом ALM которые они до сих пор продают
              а программеры уже давно разбежались
              Ответить
      • Может, этот компилятор у них и хорош, но за изобретение "деструкторы, которые надо вызвать руками" в Object Pascal надо не шляпу снимать, а скальп. Так что не всё у них хорошее.
        Ответить
        • Да ладно, хороший компилятор... неоптимизированные экзешники на раз выдаёт.
          Ответить
      • >а программисты в борланде были действительно профи, код вылизан по самое нехочу
        насколько я слышал, борланд по сравнению с другими компиляторами всегда был одним из самых отстойных в отношении кодогенерации
        Ответить
        • Не всегда. В 90-х любой уважающий себя программист предпочитал продукты борланда, как более удобные и качественные, к тому же на шаг опережающие конкурентов в развитии. Так первое время вижен либе от борланда просто не было альтернатив. Как и пакету Tutbo Professional, как и многим другим продуктам.
          А потом что-то пошло наперекосяк, кодогенераторы перестали развиваться, так и оставшись на уровне 90-х.
          Ответить
    • а я в компиляторе от mingw нашёл за пару дней два бага. вдаваться в подробности в лом, просто делаю workarounds и живу дальше.
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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