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

    −49

    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
    #include <stdio.h>
    
    void *labels[3];
    
    void test(void *ptr)
    {
        if(ptr == NULL)
        {
          labels[0] = &&l1;
          labels[1] = &&l2;
          labels[2] = &&l3;
          return;
        }
        goto *ptr;
    l1:
        printf("test1\n");
        return;
    l2:
        printf("test2\n");
        return;
    l3:
        printf("test3\n");
        return;
    }
    
    int main(void)
    {
       test(NULL);
       test(labels[0]);
       test(labels[1]);
       test(labels[2]);
    }

    Вот если б можно было делать метки указателей внутри функций видимыми извне, такой фигни б не было

    Запостил: j123123, 11 Апреля 2017

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

    • показать все, что скрытоНапример, чтобы это можно было бы делать как обращения к полям структур
      test(test.l1);
      test(test.l2);
      test(test.l3);
      Ответить
      • Нахуя?
        Ответить
        • показать все, что скрытоЧтоб лишнего кода с ненужной проверкой и ненужного глобального массива не генерировать
          Ответить
          • А нахуя вообще это все?
            Ответить
            • показать все, что скрытоТаким образом я могу убрать нахуй какой-нибудь злоебучий switch и вместо него хуйнуть сразу указатель. Это может быть например использовано для построения интерпретатора (шитый код)
              Ответить
              • Мне кажется, это может быть использовано для построения сегфолтов
                Ответить
              • зависит от архитектуры. на десктоп/сервер процах, за переход по указателю ты платишь производительностью: префетч/этц не работают.

                но ты так и не сказал чем тебе switch не угодил.

                с другой стороны, народ давно такое уже делал - просто с помощью указателей на функции. и этот подход сильно здравому рассудку не противоречит, по сравнению с computed goto.
                Ответить
                • показать все, что скрытоПроглоти мою сперму.
                  Ответить
                • >но ты так и не сказал чем тебе switch не угодил.

                  switch не всегда будет оттранслирован компилятором в таблицу переходов, а computed goto - всегда.

                  > с другой стороны, народ давно такое уже делал - просто с помощью указателей на функции.

                  Может так оказаться, что от вызовов через указатели на функции будет больше оверхеда, чем через computed goto в пределах одной функции, если пишется интерпретатор(шитый код)
                  Ответить
                  • показать все, что скрытоНе желаешь меня?
                    Ответить
                  • > switch не всегда будет оттранслирован компилятором в таблицу переходов

                    не от хорошей жизни же. и индексы часто не по порядку/с дырками, и кода часто слишком много для коротких переходов, и каких еще побочных эффектов с fall-through.

                    > вызовов через указатели на функции будет больше оверхеда, чем через computed goto в пределах одной функции

                    очевидно что у вызова выше оверхед, по сравнению с computer goto. с другой стороны, все те ограничения на которые ты жалуешься как раз и происходят то того что goto прологов/эпилогов не делает. поэтому и быстрее. но поэтому и только в пределах функции.

                    с другой стороны чувствую что ты на каких микро-контроллерах этим страдаешь. а там ведь что джамп, что колл - почти одинаково тормозят. "premature optimization".
                    Ответить
    • показать все, что скрытоLOL
      Ответить
    • показать все, что скрытоЕсть такая прога для взлома игор ArtMoney (наверное многие помнят).
      Как она работает? Разве можно в чужую память лезть?
      Ответить
    • Кстати, наверное можно так было б еще обращаться к static переменным внутри функции и менять их, ну типа
      void test()
      {
          static int a;
          printf("%i\n", a);
      }
      
      int main(void)
      {
          test.a = 0;
          test();
          test.a = 1;
          test();
          return 0;
      }

      Было б наверное норм
      Ответить
      • показать все, что скрытоБрось ты с. На асме кодь.
        Ответить
      • показать все, что скрытоВозьми да допили шланг под это дело.
        Ответить
        • А потом комитет на это посмотрит и добавит в C22.
          Ответить
        • А почему именно шланг, а не гцц?
          Ответить
          • Сверхчеловек в треде!
            Ответить
          • показать все, что скрытоГоворят, что шланг намного легче пилится.
            Ответить
            • показать все, что скрытоЯ бы с удовольствием перепилил твой шланг.
              Ответить
            • Говорить-то что угодно можно, ты исходники шланга/ллвма читать пробовал? Там его походу какие-то анскиллябры заедушные пишут
              http://llvm.org/docs/doxygen/html/AArch64AddressingModes_8h_source.html#l00644

              Я вот даже бенчмарк запилил
              https://gist.github.com/j123123/2412d39ce79b52ff6d6069300f392056
              Ответить
              • показать все, что скрыто
                // aBbbbbbc defgh000 0x00 0x00 aBbbbbbc defgh000 0x00 0x00
                Ахуенный коммент.
                Ответить
              • Так это LLVM, а не шланг. Понятно, что в LLVM жесть.
                Шланг же превращает сорцы в .llvm, так не так всё грустно.
                Ответить
                • показать все, что скрытоДа и внешние слои ллвм нормально смотрятся, имхо.
                  Ответить
                • Ну так если я запилю какие-то свои изменения в фронтэнд (clang) то он все равно будет зависеть от кривого LLVM говнокода, который мне категорически не нравится. Более того, у меня есть идеологическая неприязнь к той лицензии, под которой этот самый clang/llvm распространяется, я например не хочу чтобы мой код и мои наработки потом кто-то интегрировал в свои проприетарные хрени, не башляя мне денег за это. А вот в копилефт-опенсорс я еще могу поинвестировать свои усилия, так-то.

                  Но на самом деле все компиляторы говно, и надо чтобы компиляторы могли в символьнуые вычисления с логикой Хоара, формальная верификация, суперкомпиляция, гомоиконность, возможность написания domain-specific оптимизаций http://govnokod.ru/22687#comment379779

                  или вот например, есть две сортировки которые обе правильно работают т.е. без багов
                  char a[300];
                  scanf (a[0...299]);
                  char a1_sorted[300] 
                  char a2_sorted[300]
                  qsort(a, a1_sorted);
                  bubble_sort(a, a2_sorted);
                  if( a1_sorted == a2_sorted) // тут компилятор эту проверку должен вообще выкинуть, оставив только printf("ok, good!");
                    printf("ok, good!");
                  else
                    printf("impossible");

                  и вот собственно компилятор чтоб мог логикой Хоара доказать что обе сортировки одинаковые последовательности байт выдадут, и соответственно нефиг вообще делать проверку if( a1_sorted == a2_sorted)
                  Кроме того, если сортированные массивы впоследствии никак не используются, то можно даже и scanf (a[0...299]); выкинуть, как и сам char a[300]; оставив только имитацию его работы, ну типа если пользователь должен по логике набрать через пробел 300 чисел, то оно будет это все как бы читать(наблюдаемое пользователем поведение будет таким же), но фактически никуда эти числа записываться в массив не будут, т.к. незачем потому что мы знаем точно что что бы туда не вводили, один хрен будет printf("ok, good!");

                  Вот это действительно заебись будет
                  Ответить
                  • Ну и bubble_sort должен в таком случае на qsort заменяться, когда массив слишком большой.

                    А сборка пыха таким компилятором вообще должна standalone-версию джумлы выплёвывать.
                    Ответить
                    • > Ну и bubble_sort должен в таком случае на qsort заменяться, когда массив слишком большой.

                      Не факт. bubble_sort вполне может уделать qsort на каких-нибудь почти сортированных данных, где в случайных местах перемешаны пары элементов, типа 1 0 2 3 4 6 5 7 9 8. Но вот слегка заоптимизировать bubble_sort было б совсем не лишним. Например, если bubble_sort проходится по массиву из начала в конец, то следующий обход можно делать на единицу меньше (т.е. сортировать уже не n элементов массива, а n-1) т.к. в самую последнюю позицию массива засунуто наибольшее значение, и учитывать его смысла никакого нет
                      Ответить
                      • божественная оптимизация. Увеличиваем вес одной итерации вдвое, зато уменьшаем сложность с 0.5*n^2 до 0.5*(n-1)*n
                        Ответить
                        • >> Но вот слегка заоптимизировать bubble_sort было б совсем не лишним. Например, если bubble_sort проходится по массиву из начала в конец, то следующий обход можно делать на единицу меньше (т.е. сортировать уже не n элементов массива, а n-1) т.к. в самую последнюю позицию массива засунуто наибольшее значение, и учитывать его смысла никакого нет
                          > божественная оптимизация. Увеличиваем вес одной итерации вдвое, зато уменьшаем сложность с 0.5*n^2 до 0.5*(n-1)*n

                          Как оказалось, j123123 совершил прорыв в теории алгоритмов и обнаружил суть сортировки пузырьком: самый большой элемент "всплывает", из-за чего на следующей итерации количество неотсортированных элементов снижается и вместо n^2 получается 0.5 n^2. Но это уже и так сортировка пузырьком, в неё вшита эта "оптимизация". Соответственно, вес одной итерации остаётся прежним.

                          >> bubble_sort вполне может уделать qsort на каких-нибудь почти сортированных данных
                          Предлагаю шейкерную сортировку как пример. Для m неотсортированных элементов сложность не превысит (2m+1)n.
                          Ответить
                          • Ошибаетесь, коллега. Данное высоконаучное исследование сортировок в свое время было проведено на всемирно известном и популярном среди компьютер сраентистов сайте
                            https://habrahabr.ru/post/204600/
                            Ответить
                            • показать все, что скрытоИз этой статьи я сделал вывод что не все программисты знали про пузырьковую сортировку.
                              Ответить
                              • Автор RoR вообще признавался, что без гугла её не напишет.
                                Ответить
                                • Ну, допустим, RoR он без Гугла не напишет. А пузырьковую сортировку?
                                  Ответить
                                • > без гугла её не напишет.

                                  Я тоже не напишу. Постоянно приходится гуглить, чем она отличается от нормальной сортировки вставками.
                                  Ответить
                                  • Я путал сортировки пузырьком и выбором до тех пор, пока не пришлось рассказывать это детям. После этого запомнил.
                                    Ответить
                                    • А я, а я напишу!
                                      Ибо в детстве я не додумался прочитать документацию по стандартным BlackBox'овским коллекциям, но додумался до пузырька, сортировки выбором и счётом. Последним алгоритмом я прямо очень гордился, линейная сложность, хули.
                                      С этим связан позорный момент, что в первом софтварном рендере я не использовал z-буфер, а именно сортировал точки, включая невидимые.
                                      Ответить
                                      • Зачем, зачем ты меня слил?.. Я хочу обратно...
                                        Ответить
                                      • показать все, что скрыто<a href=http://cialis5mgohnerezeptbestellen.com/>cialis 5mg bestellen ohne rezept </a>
                                        <a href=" http://cialis5mgohnerezeptbestellen.com/ ">cialis 5mg rezeptfrei bestellen </a>
                                        Ответить
                                      • показать все, что скрыто<a href=http://viagraohnerezeptapothekepernachnahme.com/>viagra online ohne rezept gГјnstig </a>
                                        <a href=" http://viagraohnerezeptapothekepernachnahme.com/ ">viagra ohne rezept apotheke per nachnahme </a>
                                        Ответить
                                      • показать все, что скрыто<a href=http://sildenafil100mgrezeptfreikaufen.com/>sildenafil ratiopharm 100 mg testberichte </a>
                                        <a href=" http://sildenafil100mgrezeptfreikaufen.com/ ">sildenafil basics 100mg fta 60 st </a>
                                        Ответить
                                      • показать все, что скрыто<a href=http://viagragenerikakaufenindeutschland.com/>viagra generika online kaufen paypal </a>
                                        <a href=" http://viagragenerikakaufenindeutschland.com/ ">viagra generika kaufen deutschland paypal </a>
                                        Ответить
                                      • показать все, что скрыто<a href=http://sildenafilratiopharmkaufenohnerezept.com/>sildenafil ratiopharm 100 mg </a>
                                        <a href=" http://sildenafilratiopharmkaufenohnerezept.com/ ">sildenafil ratiopharm teilbar </a>
                                        Ответить
                                      • показать все, что скрыто<a href=http://cialisgenerikaindeutschlandkaufen.com/>cialis generika deutschland rezeptfrei </a>
                                        <a href=" http://cialisgenerikaindeutschlandkaufen.com/ ">cialis generika aus deutschland paypal </a>
                                        Ответить
                                      • <a href=http://propeciaprixpharmacie.com/>propecia prix pharmacie </a>
                                        <a href=" http://propeciaprixpharmacie.com/ ">propecia prix maroc </a>
                                        Ответить
                                      • <a href=http://acheterpropeciasansordonnance.com/>achat finastГ©ride sans ordonnance </a>
                                        <a href=" http://acheterpropeciasansordonnance.com/ ">achat propecia sans ordonnance </a>
                                        Ответить
                                      • <a href=http://acheteramoxicillinepascherenfrance.com/>peut on acheter amoxicilline sans ordonnance </a>
                                        <a href=" http://acheteramoxicillinepascherenfrance.com/ ">achat amoxicilline sans ordonnance </a>
                                        Ответить
                                      • <a href=http://acheteramoxicilline500enligne.com/>amoxicilline acide clavulanique sans ordonnance </a>
                                        <a href=" http://acheteramoxicilline500enligne.com/ ">acheter amoxicilline 500 en ligne </a>
                                        Ответить
                  • > if( a1_sorted == a2_sorted) // тут компилятор эту проверку должен вообще выкинуть, оставив только printf("ok, good!");
                    тут компилятор эту проверку должен вообще выкинуть, оставив только printf("impossible");*

                    можно будет подобные вещи делать на контрактах. Скажем, функция гарантирует, что при правильном использовании массив отсортирован. Но не в автоматическом режиме.
                    Ответить
              • показать все, что скрытоЧто ты этим бенцмарком хочешь сказать?

                P. S. Не анскилябры, а цори.
                Ответить
                • Цари не будет такую кучу if-ов хреначить, это неоптимально, анскильный бранчинг, предсказатели переходов... То ли дело таблица поиска
                  Ответить
                  • показать все, что скрыто> это неоптимально
                    Этот код попадает в critical path JIT'а или интепретатора, чтобы задумываться об оптимальности?

                    Так то генереция инструкций - не самая ресурсоёмкая часть конпелятора. Всяко занимает на пару порядков меньше, чем оптимизации на предыдущих этапах...
                    Ответить
                    • >Этот код попадает в critical path JIT'а или интепретатора, чтобы задумываться об оптимальности?

                      >Так то генереция инструкций - не самая ресурсоёмкая часть конпелятора. Всяко занимает на пару порядков меньше, чем оптимизации на предыдущих этапах...

                      А если я руками пишу супермегаоптимальный LLVM код на LLVM ассемблере, и для меня именно это место является причиной тормозов

                      А если серьезно, то просто неприятно на такое говно анскильное смотреть, особенно от разрабов компиляторов, они-то должны понимать что это будет неэффективно, делать кучу сравнений. Ладно б еще какой-нибудь питонист или похапешник такое написал
                      Ответить
    • показать все, что скрытогамно
      Ответить
    • rss fixed for http://govnokod.ru/22794
      Ответить
    • https://gcc.gnu.org/ml/gcc-help/2017-04/msg00051.html вот кстати что мне в мейл-листе GCC ответили по поводу этого кода
      Ответить
    • лейблы не нужны
      Ответить
      • выебу чайным пакетиком, оплата 500р, мск
        Ответить

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