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

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
  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
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
const int sum(int a, int b){
    return a+b;
}

int a(int x)
{
    const std::function<int(int)> sum4 = std::bind(sum,_1, 4);    
    return sum4(123);
}

int b(int x)
{
    puts("bagor");    
    const std::function<int(int)> sum4 = std::bind(sum,_1, 4);    
    return sum4(123);
}

int c(int x)
{
    const std::function<int(int)> sum4 = std::bind(sum,_1, 4);    
    puts("bagor");    
    return sum4(123);
}

// Функции a и b нормально инлайнятся. Ассемблерный выхлоп:

sum(int, int):                               # @sum(int, int)
        lea     eax, [rdi + rsi]
        ret
a(int):                                  # @a(int)
        mov     eax, 127
        ret
b(int):                                  # @b(int)
        push    rax
        mov     edi, offset .L.str
        call    puts
        mov     eax, 127
        pop     rcx
        ret

//А вот int c(int x)
c(int):                                  # @c(int)
        push    rbx
        sub     rsp, 32
        mov     edi, 16
        call    operator new(unsigned long)
        mov     rbx, rax
        mov     qword ptr [rax], offset sum(int, int)
        mov     dword ptr [rax + 8], 4
        mov     qword ptr [rsp], rax
        mov     qword ptr [rsp + 24], offset std::_Function_handler<int (int), std::_Bind<int const (*(std::_Placeholder<1>, int))(int, int)> >::_M_invoke(std::_Any_data const&, int&&)
        mov     qword ptr [rsp + 16], offset std::_Function_handler<int (int), std::_Bind<int const (*(std::_Placeholder<1>, int))(int, int)> >::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation)
        mov     edi, offset .L.str
        call    puts
        mov     esi, dword ptr [rbx + 8]
        mov     edi, 123
        call    qword ptr [rbx]
        mov     ebx, eax
        mov     rax, qword ptr [rsp + 16]
        test    rax, rax
        je      .LBB3_3
        mov     rdi, rsp
        mov     rsi, rdi
        mov     edx, 3
        call    rax
.LBB3_3:
        mov     eax, ebx
        add     rsp, 32
        pop     rbx
        ret
        mov     rdi, rax
        call    __clang_call_terminate
        mov     rbx, rax
        mov     rax, qword ptr [rsp + 16]
        test    rax, rax
        je      .LBB3_6
        mov     rdi, rsp
        mov     rsi, rdi
        mov     edx, 3
        call    rax
.LBB3_6:
        mov     rdi, rbx
        call    <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="550a003b223c3b310a07302620383015051901">[email protected]</a>
        mov     rdi, rax
        call    __clang_call_terminate
__clang_call_terminate:                 # @__clang_call_terminate
        push    rax
        call    __cxa_begin_catch
        call    std::terminate()
std::_Function_handler<int (int), std::_Bind<int const (*(std::_Placeholder<1>, int))(int, int)> >::_M_invoke(std::_Any_data const&, int&&): # @std::_Function_handler<int (int), std::_Bind<int const (*(std::_Placeholder<1>, int))(int, int)> >::_M_invoke(std::_Any_data const&, int&&)
        mov     rax, qword ptr [rdi]
        mov     rcx, qword ptr [rax]
        mov     edi, dword ptr [rsi]
        mov     esi, dword ptr [rax + 8]
        jmp     rcx                             # TAILCALL
std::_Function_handler<int (int), std::_Bind<int const (*(std::_Placeholder<1>, int))(int, int)> >::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation): # @std::_Function_handler<int (int), std::_Bind<int const (*(std::_Placeholder<1>, int))(int, int)> >::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation)

Решил попробовать std::bind.

https://godbolt.org/z/eW5eT5oj4

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

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

  • > ботов

    Что-то мне нямекает, что у тысяч ботов, которых регали нейронкой, пароль надёжнее моего. Ещё и у всех разный поди.
    Ответить
    • Кстати, я свой пароль сменил на вариант посложнее, когда доктор Смегма сказал про взломы.
      Ответить
      • Посоветуй хороший пароль, чтобы я больше так не попал?
        Ответить
          • Рекомендую md5(md5("123"))
            Ещё можно 123 в экспоненциальной записи, в плавающем питухе, в двоичной системе. Вариантов куча.
            Ответить
              • Гологуб, зачем ты это делаешь?
                Ответить
                • я не хочу никого огульно обвинить, но я бы поставил на дядю Пи

                  зачем ему это – фиг знает. скрипты тестит?
                  Ответить
                    • Как-то по ощущениям уёбок начинает в последнее время срать примерно в то же время, как Пи возвращается на сайт.
                      Ответить
                      • Для Пи слишком маленький уровень креатива.

                        Либо же слишком большой. Он сам намекнул недавно:
                        > Потому ответы Сверхразума на наши вопросы всегда будет выглядеть безумно и нелогично. Но это не потому что Сверхразум глуп.
                        http://govnokod.ru/27605#comment658972

                        А что если разметка комментариев - стеганографически зашифрованное послание? 1 комментарий - 1 символ?
                        Ответить
                        • > Он сам намекнул недавно

                          Он там ещё вчера недвусмысленно намекал, что "бакланопостит возникает из-за застоя".

                          Может в этом дело? Кому-то надоел застой на гк?
                          Ответить
                          • Революционеры хреновы. Система достигла оптимума, когда на сайт зайти приятно и пригласить друзей не стыдно, а у них "застой, надо срать под себя".

                            Какой багор )))
                            Ответить
                            • >>>"пригласить друзей не стыдно"

                              Согласен. Друзьям должна понравиться клякса поноса в логотипе.
                              Ответить
                  • Прикармливали уёбка одни юзеры, а виноват оказался я.
                    Тот кто старался по мере возможности игнорить раковые треды дульфятника.
                    https://govnokod.ru/13316
                    https://govnokod.ru/13215
                    https://govnokod.ru/13839

                    Нужно было больше раку отвечать на вопросы.

                    > скрипты тестит?
                    Мне что заняться нечем? Я сегодня на пляж сходил поплавал.
                    Ответить
          • Прошло столько времени, а мне все не удавалось найти одного единственного программиста, который принимал бы Селерон 600 таким как он есть, а не только ради развлечений с молодым мощным i9.
            Ответить
            • Аслан Аллахбекович важную фичу пилит. Если у него всё получится, у нас в проекте всё будет очень хорошо
              Ответить
          • Нету такого пароля, я гуглил.
            Нахуя использовать то, чем никто не пользуется?
            Ответить
            • Программисты любят использовать свои велосипеды вместо стандартных решений.
              Единственный момент, когда велосипеды реально лучше массового продукта!
              Ответить
    • Зачем ты начинаешь обсуждение в треде уёбка?
      Ответить
      • Захватывает власть изнутри. Доктор Смегма деморализован и вспоминает пароли от ещё не скрытых учёток.
        Ответить
        • А нахуя вы ему даете обратную связь, показывая какие учетки вы скрыли?
          Ответить
          • 1. Чтобы нормальные посетители ГК не создавали список заново.
            2. Чтобы он ощутил свою никчёмность.
            3. Чтобы он начал спамить с бОльшего количества учёток, и мы быстрее подготовили список для Страйкера.
            Ответить
          • > показывая какие учетки вы скрыли

            Потому что иначе он потеряет смысл жизни. Да и один фиг он добывает учётки дольше, чем они банятся.

            А вообще, всегда можно переключиться на вайтлист.
            Ответить
            • Можно еще усложнить регу новых аккаунтов, чтоб нужно было 10 раз пройти гуглокапчу с "выделите места, где есть светофоры"
              Ответить
              • На joyreactor с какого-то года надо либо заплатить 10 рублей, либо создать креативный пост, который достаточно заплюсуют.

                Питухов со слабыми паролями надо забанить, а доктор Смегма пусть регистриурует новые учётки и повышает окупаемость сайта. Как покроет затраты на хостинг и кодинг - так и быть, заслужит право спамить.
                Ответить
    • Не у всех, но пару тысяч набёреться взломанных лично мной
      Ответить
      • Хотя у большинства пароли действительно должны быть сложными
        Ответить
  • Пропаганда С++: всё zero-cost.

    Реальность: любое использование сложнее маркетингового хелоуворлда, распитушивается в несколько сот строк дрисни ассемблерного выхлопа.
    Ответить
    • zero-cost вроде бы то, чем не пользуешься

      Например в жабке нельзя отказаться от GC, а в С++ от ref counting можно
      Нельзя отказаться в жабке и от знания типов в рантайме
      В С++ можно не пользоваться, и его как-бы не будет
      Ответить
      • А отказаться от unwind table для обработки исключений по стандарту можно? Т.е. требует ли стандарт крестов, чтобы в компиляторе крестов была опция отрубания хуйни для обработки исключений?
        Ответить
        • Не знаю

          Но вроде можно -fno-unwind-tables и -fno-exceptions у gcc сказать.

          Была такая дока типа "как запихать С++ в лоу левел питушню" типа твоих контроллеров, и там как раз описывалось как всё говно поотрубать
          Ответить
              • Лучше тогда "D" взять, а не помойные кресты. Там тоже всё говно вырубить можно.
                Ответить
                • Сейчас я начну говорить, что из "D" тяжело вызывать сишный код, а ты скажешь, что и из С++ его не всегда вызовешь, и всё по второму кругу
                  Ответить
                    • VLA не компилируется в С++, нельзя автмоатически кастнуть ``void*`` во что-то, работа с юнионами различается, какие-то места более строгие

                      Там есть какое-то количество мелких отличий, и если ты макросом заебенишь "инлайн" функцию такую, то вероятно можешь отсосать.

                      Или ты про "D"?
                      Так "D" сишные хедеры не понимает.
                      Есть какая-то тула, она поддерживает семь хедеров
                      Ответить
                      • Не понимать хедеры не означает тяжело вызывать.

                        Слинкуется всё отлично, если коллконвеншен совпадает.

                        Да, прототип функции придётся описать на «D», а не тупо подключить хедер. Но тебе всё равно придётся изучать прототип функции, чтобы использовать её в своём коде.

                        Или ты думаешь, что все функции, как implode в «PHP»: перепутал порядок аргументов, а она всё равно работает.
                        Ответить
                        • >>>"implode в «PHP»: перепутал порядок аргументов, а она всё равно работает"

                          Извиняюсь, что не по теме, но поэтому я за PHP. Всё, обсуждайте пародии на языки программирования дальше.
                          Ответить
                      • > VLA не компилируется* в С++

                        * согласно стандарту, в реальных конпеляторах ситуация другая.

                        Да и зачем тебе при использовании функции VLA и касты воида во что-то? Это уже больше про конпеляцию реализации крестами.

                        З.Ы. А, тьфу, я дура. Ты же про макро/инлайн.
                        Ответить
                        • > * согласно стандарту, в реальных конпеляторах ситуация другая.

                          В вижал си -- нет.

                          > про макро/инлайн.

                          ага)

                          Вообще я не видел в дикой природе чтобы из С++ было не дёрнуть сишный API.

                          Но гипотетически такой шанс есть
                          Ответить
                          • > в дикой природе

                            Потому что юзаешь so'шки и dll'ки, скорее всего. А там из реальных проблем разве что массив нулевой длины в хедере.
                            Ответить
                            • Ну я же их через .h файлы юзаю, но макросов некомпилируемых пока не встречал.

                              Массив нулевой длины это такой хак, когда ты в последнее поле его пихаешь, и потом выделяешь память?
                              Ответить
                              • > макросов некомпилируемых пока не встречал

                                Да и не встретишь, наверное. Популярные сишные либы официально совместимы с c++, даже extern "C" сами добавляют.
                                Ответить
              • Я, кстати, вспомнил, как развлекался с кастомными рантаймами для «Турбо Паскаля» и для «Дельфи». Отрезая ненужную питушню, можно было получить экзешник на килобайт.
                Ответить
      • Речь о zero-cost абстракциях.

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

        А добавляешь одну сточку (допустим отладочную) и тут джва экрана привычной крестодрисни.

        В «Сишке» такого нет. Там препроцессор просто подставляет параметр, и обычно компилятор от этого так с ума не сходит.
        Ответить
        • хе-хе, ну нужно знать что сколько стоит. Чёпочём, как говорится.

          Например ключевое слово "virtual" может нехило там усложнить выхлоп, хотя выглядит невинно
          Ответить
          • или вот деструктор. Тоже может поднасрать
            Ответить
          • Ну так обычный метод вообще ничем не отличается от обычной функции. Разве что синтаксический сахарок для передачи this.

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

              "Виртуальность" это мощный интсрумент для выстрела в ногу реализации всякой ООПшни типа полиморфизма, но он не бесплатный

              В С++ ты можешь его отключить, и вроде в C# тоже. А например в джаве нет (хотя вероятно JIT его за тебя отключит, если ты им не пользуешься)
              Ответить
            • ну не совсем, на некоторых платформах calling conversion отличается у нестатических методов
              Ответить
              • можно пример?

                или вы про invoke{virtual,static} в йажа?
                Ответить
              • Там вроде только для передачи this бывает исключение (зарезервированный под него регистр процессора, например), а во всём остальном CC совпадает.
                Ответить

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

Помни, guest, за тобой могут следить!

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


    8