Кресты / Говнокод #21425 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
uint64_t ObjectLoadListener::getRelocationAddend(uint64_t LLVMRelocationType,
                                                 uint8_t *FixupAddress) {
  uint64_t Addend = 0;
  switch (LLVMRelocationType) {
  case IMAGE_REL_AMD64_ABSOLUTE:
    Addend = *(uint32_t *)FixupAddress;
    break;
  case IMAGE_REL_AMD64_ADDR64:
    Addend = *(uint64_t *)FixupAddress;
    break;
  case IMAGE_REL_AMD64_REL32:
    Addend = *(uint32_t *)FixupAddress;
    break;
  default:
    llvm_unreachable("Unknown reloc type.");
  }
  return Addend;
}

https://github.com/dotnet/llilc/blob/97cf48ea9a3cdf4a2582a95683a74b572f4cfe45/lib/Jit/LLILCJit.cpp#L770-L787

Надеюсь, мне не нужно объяснять, в чем тут говно?

Запостил: j123123 j123123, (Updated )

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

  • Как так!? В универе за подобное в лабах - и то, ссаными тряпками били
    Ответить
  • >>Надеюсь, мне не нужно объяснять, в чем тут говно?

    нет, там сверху в углу написанно
    Ответить
      • А если всё-таки нужно вытащить длинное значение с нечётного адреса, то нужно копировать ручками по байтикам?
        Ответить
          • Самое главное — вовремя развести дебаты, что лучше использовать: memcpy() или memmove().
            Ответить
            • Если у тебя свежезапиленная временная переменная на стеке пересекается с куском памяти, на который указывает FixupAddress, боюсь, у тебя проблемы похуже выбора между memcpy/memmove...
              Ответить
              • Если я правильно понял Царя, то всё это не важно. Главное, чтобы код правильно отработал на тестовом примере.
                Ответить
                • Этот код работает потому что царь знает как это работает
                  Ответить
                • - Почему у вас релиз не собирается?
                  - Релиз? Пацаны, я всю жизнь на дебаге собираю, УМСР.
                  - А Почему юнит тесты падают?
                  - Пацаны, это не я, я такого вообще не пишу
                  Ответить
                • ничего не знаю, у меня дома всё работало (как вариант "у меня на компьютере")
                  Ответить
                  • Надо не в оборону уходить, а с выпадом.

                    У вас говно вместо конпелятора, а входные данные вообще какая-то питушня писала. Возьмите gcc последний, линукс 64 бит, и данные на входе чоткие должны быть, а не питушня.
                    Ответить
      • Да даже если выровнен - рано или поздно на алиасинг напорешься. Тлен и безысходность.
        Ответить
          • > Чо за алиасинг?
            "Ну не могут же uint8_t и uint64_t лежать в одном и том же месте!" - подумал конпелятор и выкинул код нахуй.
            Ответить
              • Можно:
                void foo(uint32_t a)
                {
                    uint8_t *p = (uint8_t*)&a;
                    printf("%02X %02X %02X %02X", p[0], p[1], p[2], p[3]);
                }
                Ответить
                    • Ну чё-за хуита, gcc походу поумнел и на простых примерах алиасинг не получается словить...
                      Ответить
                    • Ну а как тогда реализовать свою функцию memcpy без нарушения strict aliasing? Как не крути ей придётся разъименовывать указатели.
                      Ответить
                        • так вроде войда и не было у K&R, был только char*.

                          Логичнее было бы назвать бедолагу "byte*", но боюсь что это слово тогда не было де-факто
                          Ответить
                        • а void*?

                          п.с. в pcap указатель на контекст передается через u_char. Тлен и безысходность
                          Ответить
                  • На Интелах и прочих маленьких индейцах так и будет. На этих процессорах просто принято числа записывать в таком порядке.

                    Но я подозреваю, что речь не об этом.
                    Ответить
                    • Нихуя себе!!!
                      Всегда думал что старшее слово имеет меньший адрес.
                      Ответить
                      • https://en.wikipedia.org/wiki/Endianness

                        Есть ещё процессоры со смешанным порядком (PDP-11, в котором старшее двухбайтовое слово имеет меньший адрес, но внутри каждого двухбайтового слова старший октет имеет больший адрес). А на ARM можно вообще переключать порядок октетов на ходу.
                        Ответить
                        • То есть вообще нельзя никак полагаться на способ хранения различных типов? То есть хак
                          union { 
                             uint16_t a[2];
                             uint32_t b;
                          } x;
                          x.b =123;
                          swap(x.a[0], x.a[1]);
                          x.b

                          - это всё нерабочее?
                          Ответить
                          • Ну почему же. Данный код рабочий. Вот только в каком из элементов a[0], a[1] будет лежать старший байт числа 123 (который равен нулю), а в каком — младший (равный 0x7b), можно сказать, только зная процессор (а на ARM, PowerPC, Alpha, SPARC, MIPS ещё нужно знать текущий режим работы).
                            Ответить
                            • P.S. Мне сначала показалось, что там uint8_t и uint16_t. Поэтому мой текст нужно исправить: вместо «байт» следует читать «16-битное слово».
                              Ответить
                              • Ну на это можно полагаться или это UB и компилятор может выкинуть мой код нахуй?
                                Ответить
                                • Представление чисел - implementation defined. А твой хак с юнионом - ub.
                                  Ответить
                                    • На всякий случай уточню. На способ представления чисел полагаться можно, ub не в этом.
                                      Ответить
                                      • Как тогда обменять 2 половинки int32 без UB, полагаясь на их представление?
                                        Ответить
                                        • > Как тогда обменять 2 половинки int32 без UB
                                          Сдвигами же.

                                          З.Ы. А, ты не про uint32, а про int32 - никак, переполнение, все дела... Разве что кучу ифов нахерачить, чтобы переполнения не задевать.
                                          Ответить
                                          • > сдвигами
                                            Где здесь используется представление чисел?
                                            (0b111 >> 1) == 0b11
                                            и мне похуй где располагается старшее слово, а где младшее
                                            Ответить
                                          • Товарищ, поясните, чем представления беззнакового инта отличается от знакового? Я по наивности думал, что только интерпретация разная
                                            Ответить
                                            • > чем представления беззнакового инта отличается от знакового
                                              Тем, что переполнение в знаковый разряд - UB.

                                              А общее у них только представление положительных чисел до 0 .. 2^(n-1) - 1. Отрицательные - implementation defined.
                                              Ответить
                                              • Нихуя не понима...

                                                Допустим есть

                                                1010111010 - некий 10битный чисел с первой половиной 10101 и второй 11010

                                                нужно получить
                                                1101010101

                                                Причем тут переполнение? Причем тут знаковый разряд?
                                                Ответить
                                                • Когда будешь сдвигать 11010 влево на 5 - наступишь в UB (старшая единичка заедет в знаковый разряд).
                                                  Ответить
                                                    • Каст беззнакового не из диапазона 0 .. 2^(n-1) в знаковое, емнип, тоже UB. Ну т.е. тебе придётся знаковый бит аккуратно if'ами сформировать или математикой какой-нить.
                                                      Ответить
                                                        • > почему так
                                                          Свободу процессорам и компиляторам!

                                                          Например можно реализовать проверку на переполнение, как в шарпике, и убивать прогу нахуй... Или сделать saturated числа. Стандарт не запрещает.
                                                          Ответить
                                                          • А Еще существуют места, где пишут код под конкретную версию конкретного процессора, который компилится исключительно в полнолуние?
                                                            Ответить
                                                            • > конкретную версию конкретного процессора
                                                              Эмбедщина.
                                                              Ответить
                                                              • Дяденька, я ведь не настоящий программист...

                                                                Что такое Эмбедщина?
                                                                Ответить
                                                                • > Эмбедщина
                                                                  Программирование для встраиваемых устройств (аля микроконтроллеры).
                                                                  Ответить
                                                                    • Это очень специфичная область. И программисты там бывают двух типов: "Программы - фигня, главное - железку собрать." и борманды.
                                                                      Ответить
                                                        • З.Ы. Ну и конпелятор может делать всякие оптимизации, учитывая что знаковое число не переполняется. К примеру, если он знает, что A положительно, то 2 * A тоже положительно...

                                                          Где-то здесь был пример адовых оптимизаций циклов, которые прокатывали только с int, но не с size_t.
                                                          Ответить
                                        • Кастишь в char* и меняешь местами байты. Как отметил j123123, для копирования байтов удобно использовать memcpy.
                                          Ответить
                                          • Ну так блять,
                                            хуй его знает как хранятся байты (а может даже биты) в uint32?
                                            Может змейкой или в шахматном порядке?

                                            Может всё-таки это UB и какой-нибудь конпелятор NASA для космической ракеты имеет право этот код выпилить?
                                            Ответить
                                                  • Может. Я всё равно на плюсах не пишу. Я просто охуеваю с количества граблей в C++
                                                    Ответить
                                                    • > Каст беззнакового не из диапазона 0 .. 2^(n-1) в знаковое, емнип, тоже UB.
                                                      Я может ошибаюсь, но по-моему нифига не UB, обычное implementation defined. А так как эмбедщина под конкретный процессор пишется, то вполне допустимо.
                                                      Ответить
                                                      • Не хочу показаться буквоедом, но cppreference - очень хороший сайт, и там легко найти ответы на многие подобные вопросы.

                                                        http://en.cppreference.com/w/cpp/language/implicit_conversion
                                                        > If the destination type is signed, the value does not change if the source integer can be represented in the destination type. Otherwise the result is implementation-defined. (Note that this is different from signed integer arithmetic overflow, which is undefined).
                                                        Ответить
                                                • правильно, зачем знать стандарт языка на котором пишешь?
                                                  Ответить
                            • gcc в мане явно пишут, что так можно (на их конпеляторе). А вот можно ли по стандарту - х.з.
                              Ответить
                              • по стандарту уб. потому гцц в мане и пишут, что поведение отличается от стандарта.
                                Ответить
                      • Нихуя себе!!!

                        Ты не знал про байт ордер?

                        А чего ты еще не знал?
                        Ответить
            • void* и char* алиясятся со всем. Воид по дизайну, чар из-за обратной совместимости.

              Но signed/unsigned char* не альясятся со всем.
              Ответить
              • Кастовать то можно что угодно и куда угодно, трабла не в касте, трабла именно в разадресации указателей разных типов. Поэтому void и в безопасности (его нельзя разадресовать)...

                З.Ы. Или ты как раз об этом?
                Ответить
                • Я про то что чар и войд можно использовать для type-erasure и нет опасности, что, после каста обратно и/или записи, что-то сломается, потому что компилятор решит, что это разные переменные. Но кастить не в то, что было в начале всё равно UB и может сломаться.
                  Ответить
              • а еще не из-за обратной совместимости, а потому что тогда нельзя было бы скопировать байтики из сокета в инт, и такая сишка(++) была бы не нужна
                Ответить
                • Есть несколько предложений добавить тип byte в стандарт. Не добавляют только потому что он будет идентичен чару. А особые свойства от чара не отнимут, поскольку обратная совместимость.
                  Ответить
                  • А в Паскале байт и чар — разные типы. Байт интерпретируется как число, а чар — как символ.

                    К сожалению, в сишке уже стало нормой складывать буквы с цифрами, поэтому теперь разделить не получится.
                    Ответить
  • Зачем тогда компилятор разрешает так кастить, если это заведомо UB?
    Ответить
  • Надо было писать на расте, там такое говно хотя бы компилятор не позволит сделать без обмазывания unsafe.
    Ответить
    • Фанбой в этом итт треде. Интересно, когда фанбои начнут резать ягнят в жертву компилятору.
      Ответить
    • Там по слухам и односвязный список нельзя написать без обмазывания unsafe. Это как секьюрность уровня: "давайте _все_ файлы сможет читать и писать только рут".
      Ответить
      • Вот тут пишут, как сделать двусвязный список без unsafe https://www.reddit.com/r/rust/comments/2u53le/this_is_a_doubly_linked_list_in_safe_rus t/

        Фактически, поверх вектора сделан свой аллокатор с индексами вместо сырых указателей. Несложно догадаться, что с таким аллокатором можно написать любые виды багов: и мертвые "ссылки", и порча "кучи", и вообще любая хуйня. Еще оверхед на проверку индекса при доступе к элементам вектора. Зато безопасно, че.
        Ответить
      • > односвязный список нельзя написать без обмазывания unsafe
        Ну да, если пилить односвязные списки на каждый чих, как в сишечке, то всё будет обмазано unsafe'ами... Но ведь даже в крестах так не делают, а пилят контейнер и юзают его 🙂

        Профит подхода с unsafe в том, что опасные куски легко загрепать, перечитать и обмазать на 146% тестами. А остальной код чё-попало с памятью творить не сможет.
        Ответить
        • Здорово, что они обеспокоились безопасностью за счёт типизации. Это всегда благородно. Но, как пишет Пирс в первой главе тапла, любая система типизации всегда отбрасывает и корректные программы. Простые мономорфные типы, например, лишат программы тьюринговой полноты. Нафиг нужна такая статическая типизация? (На самом деле нужна)
          В расте статические проверки тоже слишком строгие, чтобы верифицировать интересные программы.
          Ответить
    • Стандартодроч не нужен. Ты и сам его не знаешь.
      Ответить
            •  /     \             \            /    \       
              |       |             \          |      |      
              |       `.             |         |       :     
              `        |             |        \|       |     
               \       | /       /  \\\   --__ \\       :    
                \      \/   _--~~          ~--__| \     |    
                 \      \_-~                    ~-_\    |    
                  \_     \        _.--------.______\|   |    
                    \     \______// _ ___ _ (_(__>  \   |    
                     \   .  C ___)  ______ (_(____>  |  /    
                     /\ |   C ____)/      \ (_____>  |_/     
                    / /\|   C_____)       |  (___>   /  \    
                   |   (   _C_____)\______/  // _/ /     \   
                   |    \  |__   \\_________// (__/       |  
                  | \    \____)   `----   --'             |  
                  |  \_          ___\       /_          _/ | 
                 |              /    |     |  \            | 
                 |             |    /       \  \           | 
                 |          / /    |         |  \           |
                 |         / /      \__/\___/    |          |
                |           /        |    |       |         |
                |          |         |    |       |         | 
              					   |    |
                
                
                
                
                
              Ответить
    • >им бы не помешало стандарт почитать.
      мы не читаем стандарт, мы его пишем
      Ответить
  •  /     \             \            /    \       
    |       |             \          |      |      
    |       `.             |         |       :     
    `        |             |        \|       |     
     \       | /       /  \\\   --__ \\       :    
      \      \/   _--~~          ~--__| \     |    
       \      \_-~                    ~-_\    |    
        \_     \        _.--------.______\|   |    
          \     \______// _ ___ _ (_(__>  \   |    
           \   .  C ___)  ______ (_(____>  |  /    
           /\ |   C ____)/      \ (_____>  |_/     
          / /\|   C_____)       |  (___>   /  \    
         |   (   _C_____)\______/  // _/ /     \   
         |    \  |__   \\_________// (__/       |  
        | \    \____)   `----   --'             |  
        |  \_          ___\       /_          _/ | 
       |              /    |     |  \            | 
       |             |    /       \  \           | 
       |          / /    |         |  \           |
       |         / /      \__/\___/    |          |
      |           /        |    |       |         |
      |          |         |    |       |         | 
    				   |    |
      
    Ответить
  • 
    /     \             \            /    \        
    |       |             \          |      |      
    |       `.             |         |       :     
    `        |             |        \|       |     
     \       | /       /  \\\   --__ \\       :    
      \      \/   _--~~          ~--__| \     |    
       \      \_-~                    ~-_\    |    
        \_     \        _.--------.______\|   |    
          \     \______// _ ___ _ (_(__>  \   |    
           \   .  C ___)  ______ (_(____>  |  /    
           /\ |   C ____)/      \ (_____>  |_/     
          / /\|   C_____)       |  (___>   /  \    
         |   (   _C_____)\______/  // _/ /     \   
         |    \  |__   \\_________// (__/       |  
        | \    \____)   `----   --'             |  
        |  \_          ___\       /_          _/ | 
       |              /    |     |  \            | 
       |             |    /       \  \           | 
       |          / /    |         |  \           |
       |         / /      \__/\___/    |          |
      |           /        |    |       |         |
      |          |         |    |       |         |
    					   |    |				   
    
    Ответить
  • 
    /     \             \            /    \        
    |       |             \          |      |      
    |       `.             |         |       :     
    `        |             |        \|       |     
     \       | /       /  \\\   --__ \\       :    
      \      \/   _--~~          ~--__| \     |    
       \      \_-~                    ~-_\    |    
        \_     \        _.--------.______\|   |    
          \     \______// _ ___ _ (_(__>  \   |    
           \   .  C ___)  ______ (_(____>  |  /    
           /\ |   C ____)/      \ (_____>  |_/     
          / /\|   C_____)       |  (___>   /  \    
         |   (   _C_____)\______/  // _/ /     \   
         |    \  |__   \\_________// (__/       |  
        | \    \____)   `----   --'             |  
        |  \_          ___\       /_          _/ | 
       |              /    |     |  \            | 
       |             |    /       \  \           | 
       |          / /    |         |  \           |
       |         / /      \__/\___/    |          |
      |           /        |    |       |         |
      |          |         |    |       |         |
    					   |    |                  
    
    Ответить
  • 
    /     \             \            /    \        
    |       |             \          |      |      
    |       `.             |         |       :     
    `        |             |        \|       |     
     \       | /       /  \\\   --__ \\       :    
      \      \/   _--~~          ~--__| \     |    
       \      \_-~                    ~-_\    |    
        \_     \        _.--------.______\|   |    
          \     \______// _ ___ _ (_(__>  \   |    
           \   .  C ___)  ______ (_(____>  |  /    
           /\ |   C ____)/      \ (_____>  |_/     
          / /\|   C_____)       |  (___>   /  \    
         |   (   _C_____)\______/  // _/ /     \   
         |    \  |__   \\_________// (__/       |  
        | \    \____)   `----   --'             |  
        |  \_          ___\       /_          _/ | 
       |              /    |     |  \            | 
       |             |    /       \  \           | 
       |          / /    |         |  \           |
       |         / /      \__/\___/    |          |
      |           /        |    |       |         |
      |          |         |    |       |         |
    
    Ответить
  • 
    
    /     \             \            /    \        
    |       |             \          |      |      
    |       `.             |         |       :     
    `        |             |        \|       |     
     \       | /       /  \\\   --__ \\       :    
      \      \/   _--~~          ~--__| \     |    
       \      \_-~                    ~-_\    |    
        \_     \        _.--------.______\|   |    
          \     \______// _ ___ _ (_(__>  \   |    
           \   .  C ___)  ______ (_(____>  |  /    
           /\ |   C ____)/      \ (_____>  |_/     
          / /\|   C_____)       |  (___>   /  \    
         |   (   _C_____)\______/  // _/ /     \   
         |    \  |__   \\_________// (__/       |  
        | \    \____)   `----   --'             |  
        |  \_          ___\       /_          _/ | 
       |              /    |     |  \            | 
       |             |    /       \  \           | 
       |          / /    |         |  \           |
       |         / /      \__/\___/    |          |
      |           /        |    |       |         |
      |          |         |    |       |         |
    
    Ответить
  • 
    
    /     \             \            /    \        
    |       |             \          |      |      
    |       `.             |         |       :     
    `        |             |        \|       |     
     \       | /       /  \\\   --__ \\       :    
      \      \/   _--~~          ~--__| \     |    
       \      \_-~                    ~-_\    |    
        \_     \        _.--------.______\|   |    
          \     \______// _ ___ _ (_(__>  \   |    
           \   .  C ___)  ______ (_(____>  |  /    
           /\ |   C ____)/      \ (_____>  |_/     
          / /\|   C_____)       |  (___>   /  \    
         |   (   _C_____)\______/  // _/ /     \   
         |    \  |__   \\_________// (__/       |  
        | \    \____)   `----   --'             |  
        |  \_          ___\       /_          _/ | 
       |              /    |     |  \            | 
       |             |    /       \  \           | 
       |          / /    |         |  \           |
       |         / /      \__/\___/    |          |
      |           /        |    |       |         |
      |          |         |    |       |         |
    
    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8