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

    +135

    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
    int param_check(char *func, ...) {
      int fail;
      va_list al;
    
      if (!func) {
        return(1);
      }
      
      va_start(al, func);
      fail=0;
      if (!strcmp(func, "vnetGenerateDHCP") || !strcmp(func, "vnetKickDHCP")) {
        vnetConfig *a = va_arg(al, vnetConfig *);
        if (!a) {
          fail=1;
        }
      } else if (!strcmp(func, "vnetAddPublicIP") || !strcmp(func, "vnetAddDev")) {
        vnetConfig *a = va_arg(al, vnetConfig *);
        char *b = va_arg(al, char *);
        if (!a || !b) {
          fail=1;
        }
      } else if (!strcmp(func, "vnetAddHost")) {
        vnetConfig *a = va_arg(al, vnetConfig *);
        char *b = va_arg(al, char *);
        char *c = va_arg(al, char *);
        int d = va_arg(al, int);
        if (!a || !b || (d < 0) || (d > NUMBER_OF_VLANS-1)) {
          fail=1;
        }
      } else if (!strcmp(func, "vnetGetNextHost")) {
        vnetConfig *a = va_arg(al, vnetConfig *);
        char *b = va_arg(al, char *);
        char *c = va_arg(al, char *);
        int d = va_arg(al, int);
        if (!a || !b || !c || d < 0 || d > NUMBER_OF_VLANS-1) {
          fail=1;
        }
      } else if (!strcmp(func, "vnetDelHost") || !strcmp(func, "vnetEnableHost") || !strcmp(func, "vnetDisableHost")) {
        vnetConfig *a = va_arg(al, vnetConfig *);
        char *b = va_arg(al, char *);
        char *c = va_arg(al, char *);
        int d = va_arg(al, int);
        if (!a || (!b && !c) || d < 0 || d > NUMBER_OF_VLANS-1) {
          fail=1;
        }
      } else if (!strcmp(func, "vnetDeleteChain") || !strcmp(func, "vnetCreateChain")) { 
        vnetConfig *a = va_arg(al, vnetConfig *);
        char *b = va_arg(al, char *);
        char *c = va_arg(al, char *);
        if (!a || !b || !c) {
          fail=1;
        }
      } else if (!strcmp(func, "vnetTableRule")) {
        vnetConfig *a = va_arg(al, vnetConfig *);
        char *b = va_arg(al, char *);
        char *c = va_arg(al, char *);
        char *d = va_arg(al, char *);
        char *e = va_arg(al, char *);
        char *f = va_arg(al, char *);
        char *g = va_arg(al, char *);
        if (!a || !b || !c || !d || (!e && !f && !g)) {
          fail=1;
        }
      } else if (!strcmp(func, "vnetSetVlan")) {
        vnetConfig *a = va_arg(al, vnetConfig *);
        int b = va_arg(al, int);
        char *c = va_arg(al, char *);
        char *d = va_arg(al, char *);
        if (!a || b < 0 || b >= NUMBER_OF_VLANS || !c || !d) {
          fail=1;
        }
      } else if (!strcmp(func, "vnetDelVlan")) {
        vnetConfig *a = va_arg(al, vnetConfig *);
        int b = va_arg(al, int);
        if (!a || b < 0 || b >= NUMBER_OF_VLANS) {
          fail=1;
        }
      } else if (!strcmp(func, "vnetInit")) {
        vnetConfig *a = va_arg(al, vnetConfig *);
        char *b = va_arg(al, char *);
        char *c = va_arg(al, char *);
        char *d = va_arg(al, char *);
        int e = va_arg(al, int);
        if (!a || !b || !c || d<0) {
          fail=1;
        }
      }
    
      va_end(al);
    
      if (fail) {
        logprintfl (EUCAERROR, "INTERNAL ERROR: incorrect input parameters to function %s\n", func);
        return(1);
      }
      return(0);
    }

    Запостил: raorn, 21 Мая 2010

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

    • failed.
      Ответить
    • В одну функцию запихнули много. :D
      А вообще "..."(элипсис) всегда говнокод.
      Ответить
      • >(элипсис) всегда говнокод.
        в большинстве случаев так и есть
        я б не стал доверять прогеру, который не знает точное количество аргументов его собственной функции
        Ответить
        • Семейство *printf() уже не канает ?
          Ответить
          • эти функции багоопасные, но раз уж их за столько лет вылизали, то в посте специально есть оговорка 'в большинстве случаев'
            Ответить
            • Всё равно, если послать туда не верное кол-во аргументов - прога портит стэк с андифенед бехейвор.
              Ответить
              • Как раз для таких пейсателей придумали протекторы стека. Даже если захочешь - не сломаешь. Разве что аргументы будут неверно интерпретированы.
                Ответить
                • >протекторы стека
                  Не более чем костыли, и то невсегда помогают.
                  Ответить
                  • Ну уж увольте. Раз человек сел писать на Си (язык среднего уровня, его не зря кроссплатформенным ассемблером называют), то ему стоит быть благодарным хотя бы за такой костыль. Си вообще не изобилирует всякими вкусностями, в нем другие идеи реализовывались.
                    Ответить
                    • показать все, что скрытоМы не должны быть благодарны, за то что нам дают есть какашку.
                      Ответить
                      • можете работать в макдональдсе, там вроде как еда...
                        давайте не будем сравнивать языки программирования с едой, так как они все таки больше похожи на религию...
                        Ответить
                        • >так как они все таки больше похожи на религию...

                          упоминание всяких религий - лишь оправдание
                          невозможности выбрать.
                          язык это инструмент.
                          казалось бы инструмент устарел - выброси нах|й и без сожаления, но нет, лучше будем ныть и тянуть тонны легаси
                          Ответить
                          • И есть кактус.
                            Ответить
                          • ну да... считаю что лисп уже должен был давно отправиться на свалку истории... но нет, всеравно найдутся те кто с некрофильской радостью будут кричать о том что он божественнен...
                            Ответить
                          • согласен... С давно устарел... в 99% случаев он абсолютно безболезненно заменяется на С++...
                            Ответить
                            • ...и теряем в производительности, неужели фап на байты и микросекунды отменили?
                              Ответить
                              • в большинстве случаев С++ может вырулить за счет грамотного инлайна, ссылку на сортировку в С и С++ я уже кидал...
                                Ответить
                              • показать все, что скрытофапают на биты, только такие долбоёбы, как ты. Меньше играй в бейсбол, а больше в гольф
                                Ответить
                        • Какашка - это еда?
                          Ответить
        • То есть printf для Вас не кошерно? Её ведь тоже кто-то писал. (Только давайте не будем разводить здесь очередной срач С vs all)
          Ответить
        • Э, я знаю точное количество аргументов моей функции — n! («!» здесь не факториал).
          Хотя... иногда мне кажется, что их m.

          PS. С максимой про троеточие не согласен. Если-таки их действительно разное число бывает, скажем, в одном вызове установить несколько разношерстных параметров объекта. Логика внутри похожая по большей части, что же, делать несколько функций, выносить одинаковую логику в какую-то подфункцию (писать на нее документацию, модульное тестирование и кучу всякой фигни)? Усложнение на пустом месте, я щитаю.
          Ответить
          • Передать в функцию кортеж религия запрещает?
            Ответить
            • Религия-то нормально, Боженька не дает:)
              Ответить
            • Так это ж Си, а не плюсы.
              Ответить
              • И в чем проблема? В си уже нет массива?
                Ответить
                • Массив подразумевает однотипные данные. Кортеж - не обязательно. Можно передавать void* в качестве данных, но это те же не типобезопасные операции.
                  Ответить
                  • >Можно передавать void* в качестве данных, но это те же не типобезопасные операции.
                    А где головка? Сделай, что-бы это было типобезопасно. Напиши правильные макросы и функции, проверяющие типы долным образом.

                    В конце концов, если язык не подходит для решения данной задачи, то смени на более подходящий. Какие проблемы? Или других языков не знаешь, code monkey?
                    Ответить
                    • Type Inference на Си-макросах этож атас. Хотя был тут любитель ООП в Си. Смена языка иногда нежелательна, а вот перепроектировать стоило бы.
                      Ответить
                      • Если нельзя заменять Си, то вот те Си:
                        http://ru.wikipedia.org/wiki/Vala
                        И со всеми современными возможностями ФЯП.
                        Ответить
                        • >Vala
                          >И со всеми современными возможностями ФЯП.

                          Далеко не со всеми. Vala - детская игрушка. Там где Си - осознанный выбор, действительно считают каждый байт.
                          Ответить
                      • >Type Inference на Си-макросах этож атас.
                        Элипсис - вот это атас, так что ненадо.
                        Ответить
                    • Готов выслушать предложения о реализации типобезопасного кортежа на Си. Насколько это будет геморройно или вообще возможно.
                      На тему смены языка можно говорить, когда проект создается с нуля. Если надо доводить до ума уже существующий - приходится ограничиваться исходным языком.
                      Ответить
                      • Тебе тут никто ничем не обязан. Еще раз спрашиваю: голову использовать будем или признаешься, что ты code monkey?
                        Ответить
                        • Ну, если никто ничем не обязан, то нечего и спрашивать. Советую разобраться сначала в логике своих мыслей. А пока можешь ещё раз сказать свою "волшебную" фразу, если больше в мозгах ничего нет.
                          Ответить
                          • You are code monkey.
                            Ответить
                          • Чувак. Это твоё признание. Не нужно его минусовать. Я лишь повторил это вслух.
                            Эта фича тебе нужна в твоём проекте. А ты сам отказался это реализовывать, тк ты обязьяна.
                            Тебе никто не обязан здесь ничего делать, а то я напишу, а ты получишь баблосы.
                            Лучше ты сиди и мучайся и ешь свой элипсисный кактус. Вылавливай трудновыловимые ошибки по всему проекту.
                            Ответить
                            • Чувак, ты попутал. Это не мой проект, не моя фича и не мне с ней мучаться. Хватит тут срать уже. Если есть что сказать помимо обезьянничества - говори. Нет - лучше жевать молча. А то ты и так своей фразой уже признал, что в мозгах твоих ничего дельного нет.
                              Ответить
                            • > ешь свой элипсисный кактус

                              Элипсисный — это какой?
                              Ответить
                      • Где здесь головка?
                        Ответить
              • Не на браинфаке же программируешь. Умей пользоваться тем, что есть.
                Ответить
    • не говно.

      больше похоже на тестовую функцию. нечто типа программного ассерт() для вызовов, которые например приходят по сети.
      Ответить
    • Элипсис - я не знаю какой уёбок мог добавить в язык такое говно. Наверное какой-то там труп страуса зомби? Неопределённое поведение проги на пустом месте, хотя компилится.
      Ответить
      • Да-да. Говно на пустом месте это такой паттерн для С++ников.
        Ответить
        • Говно на пустом месте - есть такой паттерн. Всегда им пользуюсь, тк я программист С++.
          Ответить
    • показать все, что скрытоРезюме, примите меня на работу:
      Я программист С++.
      Я люблю есть кактус.
      ОЛОЛО.
      Ответить
    • показать все, что скрытоЯ программист С++.
      Я умею есть кактус.
      А вам слабо?
      ОЛОЛО
      Ответить
    • показать все, что скрытоОЛОЛО
      Ответить
    • показать все, что скрытоС++ ОЛОЛО
      Ответить
    • Элипсис - неопределённое поведение компилирующейся проги, в случае ошибки. Нафих такой антипаттерн.
      Ответить
    • Я драчу на каждый бит, а вам слабо?
      Ответить
    • Нет, главное к подружкам своим, таким же потаскушкам, она меня не ревновала, к проституткам каких иногда приводил прямо домой, в те дни, когда она была «занята» тоже, а тут, к матери родной ревнует!
      Ответить

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