- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 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 строчек в любом направлении.
chtulhu 16.05.2015 09:29 # +1
bormand 17.05.2015 08:12 # +3
kegdan 17.05.2015 10:10 # +3
скипидар что ле?
1024-- 17.05.2015 11:17 # +3
В конце тридцатых-начале сороковых в Германии был создан уникальный ускоритель Психотрон V8 (фау ахт), в котором крутились пучки заряженных частиц. Пациент успокаивался, наблюдая за их движением. Так раньше лечили многие расстройства психики.
В самых тяжёлых случаях использовались психотроны на основе циклотронов. Пациента немного раскручивали относительно циклотрона, вращающаяся спираль из треков частиц позволяла врачам использовать гипноз.
Во время войны все записи об экспериментах и все истории болезни были уничтожены.
kegdan 17.05.2015 11:28 # +4
inkanus-gray 17.05.2015 15:42 # 0
inkanus-gray 17.05.2015 17:39 # +1
21-я серия, самое интересное с 4:30.
kegdan 17.05.2015 12:23 # −1
1024-- 17.05.2015 12:58 # 0
kegdan 17.05.2015 13:01 # 0
1024-- 17.05.2015 13:14 # 0
1024-- 17.05.2015 13:20 # 0
Интересно, как она работает и работает ли вообще?
P.S. Даже скрывать этот комментарий не буду, т.к. тема интересная.
SSSandman 19.05.2015 13:35 # 0
bormand 19.05.2015 14:01 # +1
inkanus-gray 19.05.2015 20:54 # 0
1024-- 19.05.2015 21:09 # 0
?!
Stertor 19.05.2015 21:29 # −1
inkanus-gray 19.05.2015 21:31 # +1
Stertor 19.05.2015 21:33 # −1
Нечего сказать? Запости квадрат!
Stallman 20.05.2015 01:26 # +2
Stertor 17.05.2015 15:55 # +2
Пациент успокаивался, наблюдая за движением электронов? Что за хуйня?
inkanus-gray 17.05.2015 17:15 # +3
1024-- 18.05.2015 07:56 # 0
guesto 02.07.2016 04:33 # 0
TarasB 18.05.2015 17:11 # +1
а, не, это гк пробел вхуячил
Видел обсуждение статьи. Статья пиздёж. Цикломатическая сложность вообще левый показатель, напиши несколько ифов в ряд и пиздец какая сложность будет. Код мог быть сгенерирован (исходники, реальные исходники они видели?). Ну итд
inkanus-gray 18.05.2015 17:41 # 0
Использование watchdog в «прошивке» вызвало большие сомнения у экспертов – подконтрольным сторожевому таймеру в этой системе оказался по сути только процесс, обслуживающий редкие прерывания системного таймера, что означает – любой сбой в обработчике прочих прерываний мог приводить к исполнению неизвестно чего примерно… полторы секунды до сброса вычислителя от сторожевого таймера. И эксперты не взялись утверждать, что эти полторы секунды до сброса гарантированы, они не исключили возможности, что сброс вообще не наступит. Напоследок не менее прекрасное – коды возврата большинства вызовов RTOS, которые предназначены для сообщений об ошибках, в «прошивке» вообще игнорируются.
Dummy00001 18.05.2015 18:00 # +3
чудак возмущается там больше всего на 11К глобальных переменных. что на самом деле на встроенщине и не такое большое событие, потому что народ на стэке экономит, и все складывает в глобальные/статические переменные. расход стека достаточно сложно с 100% гарантией протестировать - а вот сегмент данных, он либо влазит в память, либо нет.
насчет MISRA, после личного знакомства, могу только сказать что MISRA как и все ему подобные conformance метрики, просто отстой. на одном проекте народ пользуется - преимущественно из-за убогости компилера - IAR - который на синтаксических ошибках, без MISRA, он просто сыпется с дюжиной ошибок, и временами ни одной ошибки на строке где находится ошибка.
Dummy00001 18.05.2015 18:05 # +3
Дело тоже не однозначное. В FreeRTOS, если её правильно сконфигурить и использовать, то там все выделяется статически, и ошибкам просто в принципе неоткуда взятся.
Но если эти уроды там динамику сделали... То там может быть все что угодно.
Единственное что в статье хоть как-то звучит правдоподобно - и настоящее говно - это "нетестируемые функции". (Если бы они только примерчиков подкинули.) Это признак того что прошивка была плохо протестирована/не 100% покрытие.
bormand 18.05.2015 18:05 # 0
Кстати, а тернарники и short-circuit and и or в ней учитывают как ветвления?
Dummy00001 18.05.2015 18:12 # 0
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.
bakagaijin 16.05.2015 10:20 # +3
kegdan 16.05.2015 10:26 # +1
bormand 16.05.2015 10:48 # 0
> реального коммерческого проекта
В каком году написан этот проект?
> Весь код в 2100 строк
Компактненько.
vr8h 17.05.2015 08:00 # +1
bormand 17.05.2015 08:06 # 0
P.S. Хотя... после преобразователя интерфейсов с прошивкой на бейсике уже поздно чему-то удивляться... what has been seen can not be unseen.
tirinox 16.05.2015 12:06 # −2
vr8h 17.05.2015 08:01 # +3
tirinox 18.05.2015 14:17 # 0
inkanus-gray 18.05.2015 15:03 # 0
Lokich 18.05.2015 15:42 # +3
*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
inkanus-gray 18.05.2015 15:44 # +1
Stallman 18.05.2015 16:45 # +3
Stallman 18.05.2015 16:46 # +3
inkanus-gray 18.05.2015 16:55 # 0
1024-- 18.05.2015 17:03 # +3
Stallman 18.05.2015 17:09 # +2
Stallman 18.05.2015 17:06 # +3
ЭКМАСкрипт - длинная дилда.
Каждый выбирает то, что больше подходит его анусу.
bormand 18.05.2015 17:26 # 0
greenx 18.05.2015 18:35 # 0
Моему анусу больше питон подходит. Не спрашивай почему.
Stallman 22.05.2015 15:43 # +1
Stertor 22.05.2015 15:52 # −1
http://www.planet-techno-science.com/wp-content/upLoads/python_royal.jpg
kegdan 18.05.2015 19:53 # 0
kegdan 18.05.2015 19:53 # +3
знаете, бекэнд, фронтэнд....
bormand 18.05.2015 20:25 # +2
kegdan 18.05.2015 20:27 # +2
Еще скажи, что это не японская анимация, а я тебе психику сломал
bormand 18.05.2015 20:33 # +2
kegdan 18.05.2015 21:41 # +1
Stallman 18.05.2015 21:17 # 0
bormand 18.05.2015 21:29 # 0
Stallman 18.05.2015 21:46 # 0
bormand 18.05.2015 21:56 # +1
Stallman 18.05.2015 23:07 # +2
kegdan 18.05.2015 23:37 # 0
Stallman 18.05.2015 23:42 # +2
kegdan 18.05.2015 23:54 # 0
"Трогай," - сказал Штирлиц шоферу. Шофер тронул. Штирлиц по-
ехал.
Stertor 19.05.2015 00:33 # 0
-Трави, сказал Столлман Кегге. Кегга траванул. Столлману понравилось стало плохо.
kegdan 19.05.2015 00:50 # +1
Stertor 19.05.2015 01:07 # 0
1024-- 19.05.2015 01:00 # −1
> стало плохо
Что, таки отравили этого шутника?
Больше не будет трактирных шуток про ЭКМАСкрипт?
Какое счастье, товарищи. Выпьем за Кегдана!
kegdan 19.05.2015 01:09 # 0
Stertor 19.05.2015 01:10 # −1
kegdan 19.05.2015 00:06 # −1
- Вы знаете, месье, у нас все номера заняты, кроме одного под крышей, темного и неудобного. Не оставаться же на улице - англичанин решил его занять. На утро портье спрашивает его, как он провел ночь.
- О, превосходно, месье!
- Мы забыли вас предупредить, что в номере находится мертвая француженка...
- Да? А я думал, что это живая англичанка!
kegdan 19.05.2015 00:15 # −1
- Извините, нельзя ли попоросить у Вас стакан воды?
- Вот он, сэр!
Через полчаса, тот же англичанин:
- Ради Бога, извините, но нельзя ли мне поросить еще один стакан воды?
- Вот он, сэр!
Через пять минут, тот же англичанин:
- Мне очень неудобно, но не были бы Вы добры дать мне еще один стакан воды?..
- Сэр, простите, Вас мучает жажда? Возьмите весь графин!.
- Спасибо, сэр! У меня в номере, знаете ли, пожар...
kegdan 19.05.2015 00:19 # −1
— Куда идёшь?
— Домой.
— Значит, к морю?
— Почему это к морю?
— А здесь всё в сторону моря. Ёбаный остров!
kegdan 18.05.2015 23:03 # +2
Программист ебется в жопу, что стать тимлидом. Ясна.
TarasB 19.05.2015 15:23 # 0
Vasiliy 19.05.2015 15:42 # +1
Stallman 19.05.2015 16:02 # +4
Stertor 19.05.2015 16:29 # −1
Vasiliy 20.05.2015 12:08 # +1
guesto 02.07.2016 22:09 # 0
TarasB 22.05.2015 10:37 # +1
bormand 18.05.2015 20:31 # +10
Ваш бекенд не справляется с возросшей нагрузкой? Мы поможем с его разработкой!
Goatse Technologies inc
TarasB 22.05.2015 10:39 # +1
guesto 02.07.2016 04:35 # 0
bormand 02.07.2016 06:31 # 0
> прочих недопрогрммистов ламеров
Как ловко ты его поставил на место...
guesto 02.07.2016 13:02 # 0
Dummy00001 18.05.2015 18:17 # +1
ЗЫ но на некоторых проектах настолько мало памяти что те 2-3К избыточности создаваемой структурами просто непозволительная роскошь. но блин для на мишн критикал экономить, это капитализм высшей пробы. за такое к стене ставить надо, что бы уродов из генпула выводить.
roman-kashitsyn 18.05.2015 18:32 # 0
bormand 18.05.2015 18:38 # 0
А функции для доступа к глобальным переменным... Имхо, лучше чуть-чуть более высокоуровневый интерфейс, чем доступ к глобалкам. Нехрен внешнему миру знать про них. К примеру, лучше сделать register_module() и find_module(), чем get_module_list() и set_module_list().
roman-kashitsyn 18.05.2015 18:58 # 0
О том и речь.
Например, я как-то работал с RT-системой, которая имела глобальный массив с конфигурацией.
И каждый раз, когда нужно было получить свойства объекта по идентификатору, люди писали
// calculate i, j, k using object id
globalConf.grandparent[i].parent[j].object[k].something
А могла бы быть функция
Object * objectById(objId);
Кмк, так гораздо проще, но никто не искал лёгких путей.
Dummy00001 18.05.2015 18:55 # 0
но самое главное: конечный результат тот же самый, что синтаксически, что семантически.
единственное правильное решение: ставить больше памяти, что бы вот такой херней не страдать. что бы локальные переменные можно было спокойно использовать. что бы памяти на отладчик динамической памяти хватало. и т.д.
у нас тут давеча проект конкурентам ушел. было очень обидно. но потом узнал что конкуренты пообещали перенести прошивку с контроллера с 128К памяти на более дешевый с 64К памяти - при этом используя С++. после этого на сердце полегчало: смеялись всем отделом долго.
bormand 18.05.2015 19:06 # 0
А в inline функции в h'ках не прокатывают?
Dummy00001 18.05.2015 19:16 # 0
bormand 18.05.2015 19:23 # 0
Dummy00001 18.05.2015 19:32 # 0
когда оптимил, читал асмы генерируемые. такого спагетти который IAR там генерил я еще ни разу в выхлопе GCC не видел. и оптимизации которые умеют код уменьшать в GCC тоже отсутствуют.
bormand 18.05.2015 19:45 # 0
Dummy00001 18.05.2015 20:56 # 0
gorthauer87 21.05.2015 13:46 # 0
Dummy00001 21.05.2015 14:15 # 0
arm/thumb? какого типа код/проект?
народ говорит что thumb подтормаживает по сравнению с arm кодом.
gorthauer87 22.05.2015 10:28 # 0
bormand 18.05.2015 18:55 # +1
О_о. А как глобальные структуры создают избыточность?
Dummy00001 18.05.2015 19:12 # +1
то что я делал это переделать часто используемую `a->b->c` на `a.b->c`. другой паря потом соптимил `a.b.c`. т.е. все указатели считаются во время компиляции. в сумме сэкономило почти 3К на 100К кода (ARM, Thumb).
bormand 18.05.2015 19:15 # 0
Dummy00001 18.05.2015 19:21 # 0
я точно не считал, но в том конкретном случае часть проблемы (и может быть самая большая) была то что структуры были относительно большими. а ARM/Thumb умеет непосредственные константы в инструкциях только 0-255. большие смещения поэтому компилеру приходилось как безымянные переменные хранить и генерить дополнительный код для их чтения.
bormand 18.05.2015 19:38 # 0
P.S. А разве доступ к a.b.c компилятор не оптимизирует в доступ тупо по констатному адресу ячейки, не складывая в рантайме &a + offsetof(b, a) + offsetof(c, b)?
Dummy00001 18.05.2015 19:44 # 0
сгенерит. но не для `a->b->c`. для полей `b` и `c` уже нужно хранить/вычислять отдельно смещения.
crazy_horse 21.05.2015 18:07 # 0