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

    +130

    1. 001
    2. 002
    3. 003
    4. 004
    5. 005
    6. 006
    7. 007
    8. 008
    9. 009
    10. 010
    11. 011
    12. 012
    13. 013
    14. 014
    15. 015
    16. 016
    17. 017
    18. 018
    19. 019
    20. 020
    21. 021
    22. 022
    23. 023
    24. 024
    25. 025
    26. 026
    27. 027
    28. 028
    29. 029
    30. 030
    31. 031
    32. 032
    33. 033
    34. 034
    35. 035
    36. 036
    37. 037
    38. 038
    39. 039
    40. 040
    41. 041
    42. 042
    43. 043
    44. 044
    45. 045
    46. 046
    47. 047
    48. 048
    49. 049
    50. 050
    51. 051
    52. 052
    53. 053
    54. 054
    55. 055
    56. 056
    57. 057
    58. 058
    59. 059
    60. 060
    61. 061
    62. 062
    63. 063
    64. 064
    65. 065
    66. 066
    67. 067
    68. 068
    69. 069
    70. 070
    71. 071
    72. 072
    73. 073
    74. 074
    75. 075
    76. 076
    77. 077
    78. 078
    79. 079
    80. 080
    81. 081
    82. 082
    83. 083
    84. 084
    85. 085
    86. 086
    87. 087
    88. 088
    89. 089
    90. 090
    91. 091
    92. 092
    93. 093
    94. 094
    95. 095
    96. 096
    97. 097
    98. 098
    99. 099
    100. 100
    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <stat.h>
    #include <conio.h>
    #include <io.h>
    #include <dos.h>
    #include <time.h>
    
    unsigned char kod_key;
    int DIAG_F,P,R,o,u,i,i2,i3,j=0,j1,j2,i1,KPR,PNSKV,KOLS,KOLS_S,KOLS_P,KS=0,KOLT,KOLT_S,KOLT_P,MAXTM,MAXTM_S,MAXTM_P;
    int F_k=0,F_PrR=0,F_N_Sv=0,K_dov,K_raz,PROZ,PROZ1,NS,NS_S,NS_P,NT_S,NT_P,NT;
    long POZ,POZ1,KOLM;
    float SDAT,x=0.0,v,v1,v2,DP=1.0,KK,KDAT=1.0,MS_P,MSO,MSO_P,MSO_S,MS, DS,DS_S,DS_P,MINMS,MINMS_S,MINMS_P,MAXMS,MAXMS_S,MAXMS_P,PM,PM_S,PM_P,MS_TEK;
    
    unsigned int k=0,k1=0,k2=0;
    float min,max,m[10],w2, w,w1;
    clock_t t1,t2,t3,t4,t5,tc_MIN,tc_MSO;
    
    time_t l1,l2;
    
    struct date d;
    struct time t,t_MIN,t_MSO;
    int F1,F2;
    union REGS rg;
    
    
    //...........................
    
    void sign()
    {
    i3++;
    x=x+(0.00001*i3);
    /*x=x+0.00244;*/
    v=x;
    v=(v+5)/0.00244;
    v1=v/256;
    v2=(int)v%256;
    outportb(BASE_5710+12,v2);
    outportb(BASE_5710+13,v1);
    }
    
    
    //...........................
    
       K_dov=0;
    kod_key=0;
    
    d1:
    while(!kod_key)
    {
    _AH=3;
    _AL=1;
    _DX=1;
    geninterrupt(0x17);
    kod_key=_AH;
    opros();
    if(MS_TEK>=2*PM)
    break;
    }
    if(kod_key)
    {
        switch(kod_key)
    
       {
       case 5:
       K_dov=1;
      goto kon_d;
       break;
    
       default:
       kod_key=0;
       goto d1;
       break;
    
    }
     }
    
    if(R==1)
    {
    R=0;
    NT++;
    }
    
    //...........................
    
    if(kod_key)
    {
        switch(kod_key)
    
       {
       case 5:
       K_dov=1;
      goto kon_d;
       break;
       default:
       kod_key=0;
       break;
    }
      }

    Код из реального коммерческого проекта. Все переменные объявлены глобально. Весь код в 2100 строк находится в одном файле. Комментариев нет. Внятных имён нет. Форматирования нет. Магические коэффициенты и флаги непонятных состояний повсюду. Бесконечное самоповторение. В наличии 7 функций, 2 из которых - это 85% всего кода проекта. Переходы по goto на 500 строчек в любом направлении.

    Запостил: vr8h, 16 Мая 2015

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

    • http://ko.com.ua/kachestvo_vstraivaemogo_po_ili_pogrom_vs yo-taki_sluchilsya_98518
      Ответить
      • До кучи: https://ru.wikipedia.org/wiki/Therac-25
        Ответить
        • >>медицинский ускоритель

          скипидар что ле?
          Ответить
          • А вот не надо шутить, это серьёзная наука.

            В конце тридцатых-начале сороковых в Германии был создан уникальный ускоритель Психотрон V8 (фау ахт), в котором крутились пучки заряженных частиц. Пациент успокаивался, наблюдая за их движением. Так раньше лечили многие расстройства психики.
            В самых тяжёлых случаях использовались психотроны на основе циклотронов. Пациента немного раскручивали относительно циклотрона, вращающаяся спираль из треков частиц позволяла врачам использовать гипноз.
            Во время войны все записи об экспериментах и все истории болезни были уничтожены.
            Ответить
            • >> Во время войны все записи об экспериментах и все истории болезни были уничтожены.

              http://www.youtube.com/watch?v=imLhqVEe6E4
              Ответить
              • Кстати, не могу нагуглить выпуск про карающий меч в руках Дебелунгов. В нём было много смешных псевдонемецких терминов.
                Ответить
                • P.S. Нашёл: http://vk.com/video-50171927_167908183

                  21-я серия, самое интересное с 4:30.
                  Ответить
            • !
              Ответить
            • >>Пациент успокаивался, наблюдая за их движением.

              Пациент успокаивался, наблюдая за движением электронов? Что за хуйня?
              Ответить
              • У 1024-- написано про пучки заряженных частиц и ни слова об электронах. Может быть, в качестве «частиц» использовались пушечные ядра?
                Ответить
              • Арийцы - талантливые от природы люди с отличным восприятием. Могли видеть возмущения Силы от пролетающих частиц с временем жизни менее 2.84нс. Экстрасенсы, гении и новаторы. Но теперь это забыто, т.к. власти СССР не хотели допустить панику среди мирного населения и уничтожили все документы.
                Ответить
            • Я тоже играл в спеар оф дестини
              Ответить
      • ссылка не работает
        а, не, это гк пробел вхуячил

        Видел обсуждение статьи. Статья пиздёж. Цикломатическая сложность вообще левый показатель, напиши несколько ифов в ряд и пиздец какая сложность будет. Код мог быть сгенерирован (исходники, реальные исходники они видели?). Ну итд
        Ответить
        • А как прокомментируете следующий абзац?

          Использование watchdog в «прошивке» вызвало большие сомнения у экспертов – подконтрольным сторожевому таймеру в этой системе оказался по сути только процесс, обслуживающий редкие прерывания системного таймера, что означает – любой сбой в обработчике прочих прерываний мог приводить к исполнению неизвестно чего примерно… полторы секунды до сброса вычислителя от сторожевого таймера. И эксперты не взялись утверждать, что эти полторы секунды до сброса гарантированы, они не исключили возможности, что сброс вообще не наступит. Напоследок не менее прекрасное – коды возврата большинства вызовов RTOS, которые предназначены для сообщений об ошибках, в «прошивке» вообще игнорируются.
          Ответить
          • по теории контроллер он real-time, и самая главная проверка там должна быть на соблюдения правил real-time-ности. вотчдог это только дополнительная проверка если уже все совсем упало, и по теории в mission-critical девайсе до этого просто в принципе доходить не должно.

            чудак возмущается там больше всего на 11К глобальных переменных. что на самом деле на встроенщине и не такое большое событие, потому что народ на стэке экономит, и все складывает в глобальные/статические переменные. расход стека достаточно сложно с 100% гарантией протестировать - а вот сегмент данных, он либо влазит в память, либо нет.

            насчет MISRA, после личного знакомства, могу только сказать что MISRA как и все ему подобные conformance метрики, просто отстой. на одном проекте народ пользуется - преимущественно из-за убогости компилера - IAR - который на синтаксических ошибках, без MISRA, он просто сыпется с дюжиной ошибок, и временами ни одной ошибки на строке где находится ошибка.
            Ответить
          • > Напоследок не менее прекрасное – коды возврата большинства вызовов RTOS, которые предназначены для сообщений об ошибках, в «прошивке» вообще игнорируются.

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

            Но если эти уроды там динамику сделали... То там может быть все что угодно.

            Единственное что в статье хоть как-то звучит правдоподобно - и настоящее говно - это "нетестируемые функции". (Если бы они только примерчиков подкинули.) Это признак того что прошивка была плохо протестирована/не 100% покрытие.
            Ответить
        • > Цикломатическая сложность
          Кстати, а тернарники и short-circuit and и or в ней учитывают как ветвления?
          Ответить
          • да. нет.

            http://eclipse-metrics.sourceforge.net/descriptions/pages/CyclomaticComplexity.html

            "A method with no branches has a Cyclomatic Complexity of 1 since there is 1 arc. This number is incremented whenever a branch is encountered. In this implementation, statements that represent branching are defined as: 'for', 'while', 'do', 'if', 'case' (optional), 'catch' (optional) and the ternary operator (optional). The sum of Cyclomatic Complexities for methods in local classes is also included in the total for a method."

            на большинстве real-world проектов McCabe пролетает потому что case'ы считает за ветвления. на вид тривиальные функции диспатча или (де)сериализации данных с легкостью зашкаливают за 500.
            Ответить
    • Писал жесточайший железячник, не?
      Ответить
    • > #include <dos.h>
      > реального коммерческого проекта
      В каком году написан этот проект?

      > Весь код в 2100 строк
      Компактненько.
      Ответить
      • До 2005 года точно. Писался для контроллера.
        Ответить
        • Интеловский контроллер, да ещё и с досом на борту? О_о.

          P.S. Хотя... после преобразователя интерфейсов с прошивкой на бейсике уже поздно чему-то удивляться... what has been seen can not be unseen.
          Ответить
    • Да ладно. В любом проекте на Си куча глобальных переменных. Это не показатель. Остальное говно, да.
      Ответить
      • Только тех, которые нужны глобально, но не всех же.
        Ответить
        • Шо! Еще и запоминать надо, которые где нужны?
          Ответить
          • Переходите на C++. Там вместо глобальных переменных можно завести класс с кучей полей, в который можно высирать все данные.
            Ответить
            • >Переходите на C++.
              *YOU* are full of bullshit.

              C++ is a horrible language. It's made more horrible by the fact that a lot
              of substandard programmers use it, to the point where it's much much
              easier to generate total and utter crap with it. Quite frankly, even if
              the choice of C were to do *nothing* but keep the C++ programmers out,
              that in itself would be a huge reason to use C.

              http://harmful.cat-v.org/software/c++/linus
              Ответить
              • Уговорили. Переходите на любой язык программирования с ООП, кроме C++.
                Ответить
                • Например на PHP. Там аж две реализации наследования, всё для людей.
                  Ответить
                  • И, кстати, там можно не только срать в публичную статику, но ещё и наследовать её прямиком через анус. Такой- то простор для ректальных утех! ^-^
                    Ответить
                    • Если PHP — это простор для ректальных утех, то что такое тогда ЭКМАскрипт?
                      Ответить
                      • Вот если бы в ЭКМАСкрипте строки сравнивались сначала как числа, то да. А так ПХП далеко впереди на рынке интимных услуг.
                        Ответить
                        • Зато в ЭКМАСкрипте можно срать прямо в прототипы. В умелых руках способен доставить удовольствие даже Кирку.
                          Ответить
                      • PHP - толстая дилда.
                        ЭКМАСкрипт - длинная дилда.
                        Каждый выбирает то, что больше подходит его анусу.
                        Ответить
                        • А C/C++?
                          Ответить
                          • А С/С++ - с усиками.

                            Моему анусу больше питон подходит. Не спрашивай почему.
                            Ответить
                            • Гибок, благодаря чему способен принять форму любого кишечника, что способствует более глубокому проникновению.
                              Ответить
                              • Ты за себя говори. Небось, любишь тоже подушить питона?
                                http://www.planet-techno-science.com/wp-content/upLoads/python_royal.jpg
                                Ответить
                          • ACDC!
                            Ответить
                      • Простор для оральных утех.
                        знаете, бекэнд, фронтэнд....
                        Ответить
                        • Ну вот нахуя зачем ты это написал, а? Я теперь услышав о опыте фронтенд- или бекенд-разработки буду совсем не то представлять ;(
                          Ответить
                          • можно подумать ты раньше то представлял

                            Еще скажи, что это не японская анимация, а я тебе психику сломал
                            Ответить
                            • Кегдан-кун, ты не прав... Японская анимация никак не сказывается на психике, ня ^_^
                              Ответить
                            • Кстати, о бэкэнде в японской анимации... http://www.world-art.ru/animation/animation.php?id=3029
                              Ответить
                              • Ну и о фронтенде, тогда уж: http://www.world-art.ru/animation/animation.php?id=5909
                                Ответить
                                • Смотрел. Ничего они там такого не делают. Переводчики-надмозги как всегда в своём репертуаре.
                                  Ответить
                                  • Ага. Совсем ничего такого, не хентай же. Но няшка, тем не менее, профдеформацию заработала (вспомни сцену с мороженым).
                                    Ответить
                                    • Я б поработал на такой работе, тщмт. Уж лучше такая профдеформация чем нажитый геморрой и коллекция смищных шуток про пхп и гоатсе.
                                      Ответить
                                      • пф у меня есть смищные шутки обо всем
                                        Ответить
                                        • Трави.
                                          Ответить
                                          • про гейство

                                            "Трогай," - сказал Штирлиц шоферу. Шофер тронул. Штирлиц по-
                                            ехал.
                                            Ответить
                                            • -Трогай, - сказал Штирлиц шоферу. Шофер тронул. Штирлицу понравилось.

                                              -Трави, сказал Столлман Кегге. Кегга траванул. Столлману понравилось стало плохо.
                                              Ответить
                                              • Я не виноват, что у вас не такое тонкое нёбо как у меня
                                                Ответить
                                                • Чем же ты его истончил? Моё грязное воображение рисует ужасные образы. Прям, BitBlt какое-то.
                                                  Ответить
                                              • > Трави
                                                > стало плохо
                                                Что, таки отравили этого шутника?

                                                Больше не будет трактирных шуток про ЭКМАСкрипт?
                                                Какое счастье, товарищи. Выпьем за Кегдана!
                                                Ответить
                                          • Молодой англичанин поздно вечером приходит в гостиницу во Франции и просит номер.
                                            - Вы знаете, месье, у нас все номера заняты, кроме одного под крышей, темного и неудобного. Не оставаться же на улице - англичанин решил его занять. На утро портье спрашивает его, как он провел ночь.
                                            - О, превосходно, месье!
                                            - Мы забыли вас предупредить, что в номере находится мертвая француженка...
                                            - Да? А я думал, что это живая англичанка!
                                            Ответить
                                          • В гостинице. Англичанин подходит к портье:
                                            - Извините, нельзя ли попоросить у Вас стакан воды?
                                            - Вот он, сэр!
                                            Через полчаса, тот же англичанин:
                                            - Ради Бога, извините, но нельзя ли мне поросить еще один стакан воды?
                                            - Вот он, сэр!
                                            Через пять минут, тот же англичанин:
                                            - Мне очень неудобно, но не были бы Вы добры дать мне еще один стакан воды?..
                                            - Сэр, простите, Вас мучает жажда? Возьмите весь графин!.
                                            - Спасибо, сэр! У меня в номере, знаете ли, пожар...
                                            Ответить
                                          • Встретились два англичанина:
                                            — Куда идёшь?
                                            — Домой.
                                            — Значит, к морю?
                                            — Почему это к морю?
                                            — А здесь всё в сторону моря. Ёбаный остров!
                                            Ответить
                              • >>Дзюнъя Мотидзуки - простой служащий в компьютерной компании. Очень вежливый, опрятный и отзывчивый. Приятная внешность и абсолютная безотказность делают его привлекательным не только для служебных отношений. Как-то его непосредственный начальник сказал: "В этом мире не возможно продвинуться, поддерживая высокий моральный облик". Дзунья очень быстро выучил этот урок и теперь быстро поднимается вверх по служебной лестнице, улаживая все проблемы с руководством в постели. Ведь для человека, чье сердце не умеет любить, нет ничего проще, чем играть на желаниях и чувствах других.

                                Программист ебется в жопу, что стать тимлидом. Ясна.
                                Ответить
                                • Это в гугле так, наверное.
                                  Ответить
                                • Я боюсь представить. Куда надо ебаться, что бы стать тех диром.
                                  Ответить
                                  • Главное не куда ебаться, а с кем.
                                    Ответить
                                    • Вспомнил занятную историю. Соседская бабка вела разговоры на современные темы с более молодыми соседками. По правде сказать, они троллили ее, провоцировали, а потом ржали, но бабка этого не замечала. Вдруг бабка изрекла фразу вроде "пизда не только для пись-пись, но и дела улаживать" - лавка моментально опустела. Соседки стремглав бросились домой, а когда прошло некоторое время, бабка их спрашивает: чего это вы убежали? А они отвечают: "прости нас, Верочка, мы побежали трусы менять. обоссались от смеха"
                                      Ответить
                                      • Их просто осенило. А ведь бабка истину сказала. Через несколько веков будут "бабку" цитировать как сейчас Конфуция.
                                        Ответить
                                      • Это был ьы?
                                        Ответить
                                  • Самых опущенных петухов, которые с удовольствием принимают любые унижения, пидоров с очком больше цинкового ведра на 16 литров, отправляют поддерживать средства разработки мобильных приложений. Это они сделали такой НДК, в котором примеры изначально даже не собираются, и такую консоль разработчика, из которой я даже не могу скачать собственную программу, это они придумали неработающее АПИ на половине железа.
                                    Ответить
                        • Разработка бекенда.

                          Ваш бекенд не справляется с возросшей нагрузкой? Мы поможем с его разработкой!

                          Goatse Technologies inc
                          Ответить
              • Лол, мнение пыховцев, джаваскриптеров, и прочих недопрогрммистов ламеров очень важно для мну
                Ответить
                • > Линус Торвальдс
                  > прочих недопрогрммистов ламеров
                  Как ловко ты его поставил на место...
                  Ответить
                  • Я о Лохыче, а не о Линусе. Почему Линус ненавидит коесты понятно
                    Ответить
      • и да и нет. глобальные переменные тоже можно окультурить. я народ постоянно пихаю что бы все складывали в глобальные структуры, а не просто так переменные раскладывали.

        ЗЫ но на некоторых проектах настолько мало памяти что те 2-3К избыточности создаваемой структурами просто непозволительная роскошь. но блин для на мишн критикал экономить, это капитализм высшей пробы. за такое к стене ставить надо, что бы уродов из генпула выводить.
        Ответить
        • Макконнелл, помню, предлагал делать функции для доступа к глобальным переменным. Кмк, весьма здравая мысль.
          Ответить
          • Ну в общем-то если глобалки не торчат за пределы модуля - они вполне управляемы.

            А функции для доступа к глобальным переменным... Имхо, лучше чуть-чуть более высокоуровневый интерфейс, чем доступ к глобалкам. Нехрен внешнему миру знать про них. К примеру, лучше сделать register_module() и find_module(), чем get_module_list() и set_module_list().
            Ответить
            • > Имхо, лучше чуть-чуть более высокоуровневый интерфейс, чем доступ к глобалкам.

              О том и речь.

              Например, я как-то работал с RT-системой, которая имела глобальный массив с конфигурацией.
              И каждый раз, когда нужно было получить свойства объекта по идентификатору, люди писали

              // calculate i, j, k using object id
              globalConf.grandparent[i].parent[j].object[k].something

              А могла бы быть функция
              Object * objectById(objId);

              Кмк, так гораздо проще, но никто не искал лёгких путей.
              Ответить
          • это тоже стоит места. я на одном проекте функции в макро сконвертил, и на этом (в ~80К двоичного кода) 1.5К сэкономил. это слишком много (почти 2%).

            но самое главное: конечный результат тот же самый, что синтаксически, что семантически.

            единственное правильное решение: ставить больше памяти, что бы вот такой херней не страдать. что бы локальные переменные можно было спокойно использовать. что бы памяти на отладчик динамической памяти хватало. и т.д.

            у нас тут давеча проект конкурентам ушел. было очень обидно. но потом узнал что конкуренты пообещали перенести прошивку с контроллера с 128К памяти на более дешевый с 64К памяти - при этом используя С++. после этого на сердце полегчало: смеялись всем отделом долго.
            Ответить
            • > функции в макро
              А в inline функции в h'ках не прокатывают?
              Ответить
            • Кстати, а link-time optimization не пробовал поюзать? Когда я тестил, gcc неплохо так инлайнило функции из соседних объектников.
              Ответить
              • у меня шанса тестировать это не было. у нас тут IAR для этих вещей используется и он "multi-file optimization" поддерживает. и как ты понимаешь цель не сам по себе инлайн - а размер кода. IAR - отстой, но профессионалы говорят что на ARM, он #2 по компактности генерируемого кода (после Keil). а гцц почти официально не оптимизируется на генерацию компактного кода - их цель это официальные бенчи.

                когда оптимил, читал асмы генерируемые. такого спагетти который IAR там генерил я еще ни разу в выхлопе GCC не видел. и оптимизации которые умеют код уменьшать в GCC тоже отсутствуют.
                Ответить
                • Т.е. код gcc будет шустрее iar'овского, но больше?
                  Ответить
                  • теоретически - да. практически - хез.
                    Ответить
                    • Я это проверял именно практически, код в keil процентов на 20 меньше, но примерно на столько же медленнее. IAR не проверял.
                      Ответить
                      • > код в keil процентов на 20 меньше, но примерно на столько же медленнее.

                        arm/thumb? какого типа код/проект?

                        народ говорит что thumb подтормаживает по сравнению с arm кодом.
                        Ответить
                        • thumb врубал во флагах, но вообще, конкретно gcc шустрее работает с математикой, особенно заметно с hardfp.
                          Ответить
        • > 2-3К избыточности создаваемой структурами
          О_о. А как глобальные структуры создают избыточность?
          Ответить
          • если делаешь все структурами, то данные организуются иерархически, и в структуре часто лежит указатель на другую структуру. каждое разыменование - это дополнительный код.

            то что я делал это переделать часто используемую `a->b->c` на `a.b->c`. другой паря потом соптимил `a.b.c`. т.е. все указатели считаются во время компиляции. в сумме сэкономило почти 3К на 100К кода (ARM, Thumb).
            Ответить
            • А, ну я себе это и представил именно как a.b.c (тупо структуры друг в друге, без указателей). Вот и подумал, откуда оверхед то.
              Ответить
              • > Вот и подумал, откуда оверхед то.

                я точно не считал, но в том конкретном случае часть проблемы (и может быть самая большая) была то что структуры были относительно большими. а ARM/Thumb умеет непосредственные константы в инструкциях только 0-255. большие смещения поэтому компилеру приходилось как безымянные переменные хранить и генерить дополнительный код для их чтения.
                Ответить
                • Ясно.

                  P.S. А разве доступ к a.b.c компилятор не оптимизирует в доступ тупо по констатному адресу ячейки, не складывая в рантайме &a + offsetof(b, a) + offsetof(c, b)?
                  Ответить
                  • > А разве доступ к a.b.c компилятор не оптимизирует в доступ тупо по адресу ячейки[?]

                    сгенерит. но не для `a->b->c`. для полей `b` и `c` уже нужно хранить/вычислять отдельно смещения.
                    Ответить
    • Один вопрос: как они это мержат?
      Ответить

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