1. C++ / Говнокод #27619

    0

    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
    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    [email protected]
            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, 27 Августа 2021

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

    • Ожидайте
      Ответить
    • > ботов

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

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

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

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

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

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

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

                                Согласен. Друзьям должна понравиться клякса поноса в логотипе.
                                Ответить
                          • Не ищите скрытого смысла там где его нет.
                            Ответить
                          • > А что если разметка комментариев - стеганографически зашифрованное послание

                            Это я с 2017 одной и той же фразой сру послания? Сложно как-то.

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

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

                      > скрипты тестит?
                      Мне что заняться нечем? Я сегодня на пляж сходил поплавал.
                      Ответить
          • r3fC%bnx8w!o0Wd_

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






















































































































































































            Ответить
            • Ураа! Я научился тоже так делать благодаря 1024--!
              Ответить
              • Хм, а у меня же ещё и скрипт был, который сохраняет и отображает комментарии в таком виде. Со скриптом можно общаться с другими пользователями только пробельными символами.
                Ответить
              • Короткий только какой-то. У меня был комментарий, который не стыдно показать: http://govnokod.ru/23435#comment391847
                Ответить
        • Захватывает власть изнутри. Доктор Смегма деморализован и вспоминает пароли от ещё не скрытых учёток.
          Ответить
          • А нахуя вы ему даете обратную связь, показывая какие учетки вы скрыли?
            Ответить
            • 1. Чтобы нормальные посетители ГК не создавали список заново.
              2. Чтобы он ощутил свою никчёмность.
              3. Чтобы он начал спамить с бОльшего количества учёток, и мы быстрее подготовили список для Страйкера.
              Ответить
            • > показывая какие учетки вы скрыли

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

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

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

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

        Например в жабке нельзя отказаться от GC, а в С++ от ref counting можно
        Нельзя отказаться в жабке и от знания типов в рантайме
        В С++ можно не пользоваться, и его как-бы не будет
        Ответить
        • А отказаться от unwind table для обработки исключений по стандарту можно? Т.е. требует ли стандарт крестов, чтобы в компиляторе крестов была опция отрубания хуйни для обработки исключений?
          Ответить
          • Стандарт вроде не говорит про то, как unwind должен быть запилен, только про то, что должно произойти [1]. Полина или борманд пусть поправят.
            [1] https://github.com/cplusplus/draft/blob/e125ca7c66725801da118fa936e1444b22f8fb23/source/exceptions.tex
            Ответить
          • Не знаю

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

            Была такая дока типа "как запихать С++ в лоу левел питушню" типа твоих контроллеров, и там как раз описывалось как всё говно поотрубать
            Ответить
            • о, нашел доку
              https://alex-robenko.gitbook.io/bare_metal_cpp/

              С++, который понравится j123123!
              Ответить
              • нахуй исключеиня
                https://alex-robenko.gitbook.io/bare_metal_cpp/compiler_output/exceptions

                назуй RTTI
                https://alex-robenko.gitbook.io/bare_metal_cpp/compiler_output/rtti

                нахуй STL
                https://alex-robenko.gitbook.io/bare_metal_cpp/compiler_output/nostdlib
                Ответить
                • Лучше тогда "D" взять, а не помойные кресты. Там тоже всё говно вырубить можно.
                  Ответить
                  • Или «Nim».
                    Ответить
                  • Сейчас я начну говорить, что из "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 совпадает.
                  Ответить

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