Няшная / Говнокод #22794 Ссылка на оригинал

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
#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 j123123, (Updated )

Комментарии (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".
                  Ответить
  • Есть такая прога для взлома игор 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.
        Ответить
            • Так это 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 ассемблере, и для меня именно это место является причиной тормозов

                    А если серьезно, то просто неприятно на такое говно анскильное смотреть, особенно от разрабов компиляторов, они-то должны понимать что это будет неэффективно, делать кучу сравнений. Ладно б еще какой-нибудь питонист или похапешник такое написал
                    Ответить
                    • вот смотри. Ты великий разработчик компилятора LLVM, программист с большой буквы царь, а не какой-то там говно/быдло/методичко/веб-кодер. Зачем тебе оптимизировать каждую строчку кода компилятора, если ты можешь написать патч в оптимизатор этого самого компилятора, чтобы он делал это за тебя?
                      Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8