- 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 строчек в любом направлении.
скипидар что ле?
В конце тридцатых-начале сороковых в Германии был создан уникальный ускоритель Психотрон V8 (фау ахт), в котором крутились пучки заряженных частиц. Пациент успокаивался, наблюдая за их движением. Так раньше лечили многие расстройства психики.
В самых тяжёлых случаях использовались психотроны на основе циклотронов. Пациента немного раскручивали относительно циклотрона, вращающаяся спираль из треков частиц позволяла врачам использовать гипноз.
Во время войны все записи об экспериментах и все истории болезни были уничтожены.
21-я серия, самое интересное с 4:30.
Интересно, как она работает и работает ли вообще?
P.S. Даже скрывать этот комментарий не буду, т.к. тема интересная.
?!
Нечего сказать? Запости квадрат!
Пациент успокаивался, наблюдая за движением электронов? Что за хуйня?
а, не, это гк пробел вхуячил
Видел обсуждение статьи. Статья пиздёж. Цикломатическая сложность вообще левый показатель, напиши несколько ифов в ряд и пиздец какая сложность будет. Код мог быть сгенерирован (исходники, реальные исходники они видели?). Ну итд
Использование watchdog в «прошивке» вызвало большие сомнения у экспертов – подконтрольным сторожевому таймеру в этой системе оказался по сути только процесс, обслуживающий редкие прерывания системного таймера, что означает – любой сбой в обработчике прочих прерываний мог приводить к исполнению неизвестно чего примерно… полторы секунды до сброса вычислителя от сторожевого таймера. И эксперты не взялись утверждать, что эти полторы секунды до сброса гарантированы, они не исключили возможности, что сброс вообще не наступит. Напоследок не менее прекрасное – коды возврата большинства вызовов RTOS, которые предназначены для сообщений об ошибках, в «прошивке» вообще игнорируются.
чудак возмущается там больше всего на 11К глобальных переменных. что на самом деле на встроенщине и не такое большое событие, потому что народ на стэке экономит, и все складывает в глобальные/статические переменные. расход стека достаточно сложно с 100% гарантией протестировать - а вот сегмент данных, он либо влазит в память, либо нет.
насчет MISRA, после личного знакомства, могу только сказать что MISRA как и все ему подобные conformance метрики, просто отстой. на одном проекте народ пользуется - преимущественно из-за убогости компилера - IAR - который на синтаксических ошибках, без MISRA, он просто сыпется с дюжиной ошибок, и временами ни одной ошибки на строке где находится ошибка.
Дело тоже не однозначное. В 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.
> реального коммерческого проекта
В каком году написан этот проект?
> Весь код в 2100 строк
Компактненько.
P.S. Хотя... после преобразователя интерфейсов с прошивкой на бейсике уже поздно чему-то удивляться... what has been seen can not be unseen.
*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
ЭКМАСкрипт - длинная дилда.
Каждый выбирает то, что больше подходит его анусу.
Моему анусу больше питон подходит. Не спрашивай почему.
http://www.planet-techno-science.com/wp-content/upLoads/python_royal.jpg
знаете, бекэнд, фронтэнд....
Еще скажи, что это не японская анимация, а я тебе психику сломал
"Трогай," - сказал Штирлиц шоферу. Шофер тронул. Штирлиц по-
ехал.
-Трави, сказал Столлман Кегге. Кегга траванул. Столлману понравилось стало плохо.
> стало плохо
Что, таки отравили этого шутника?
Больше не будет трактирных шуток про ЭКМАСкрипт?
Какое счастье, товарищи. Выпьем за Кегдана!
- Вы знаете, месье, у нас все номера заняты, кроме одного под крышей, темного и неудобного. Не оставаться же на улице - англичанин решил его занять. На утро портье спрашивает его, как он провел ночь.
- О, превосходно, месье!
- Мы забыли вас предупредить, что в номере находится мертвая француженка...
- Да? А я думал, что это живая англичанка!
- Извините, нельзя ли попоросить у Вас стакан воды?
- Вот он, сэр!
Через полчаса, тот же англичанин:
- Ради Бога, извините, но нельзя ли мне поросить еще один стакан воды?
- Вот он, сэр!
Через пять минут, тот же англичанин:
- Мне очень неудобно, но не были бы Вы добры дать мне еще один стакан воды?..
- Сэр, простите, Вас мучает жажда? Возьмите весь графин!.
- Спасибо, сэр! У меня в номере, знаете ли, пожар...
— Куда идёшь?
— Домой.
— Значит, к морю?
— Почему это к морю?
— А здесь всё в сторону моря. Ёбаный остров!
Программист ебется в жопу, что стать тимлидом. Ясна.
Ваш бекенд не справляется с возросшей нагрузкой? Мы поможем с его разработкой!
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);
Кмк, так гораздо проще, но никто не искал лёгких путей.
но самое главное: конечный результат тот же самый, что синтаксически, что семантически.
единственное правильное решение: ставить больше памяти, что бы вот такой херней не страдать. что бы локальные переменные можно было спокойно использовать. что бы памяти на отладчик динамической памяти хватало. и т.д.
у нас тут давеча проект конкурентам ушел. было очень обидно. но потом узнал что конкуренты пообещали перенести прошивку с контроллера с 128К памяти на более дешевый с 64К памяти - при этом используя С++. после этого на сердце полегчало: смеялись всем отделом долго.
А в inline функции в h'ках не прокатывают?
когда оптимил, читал асмы генерируемые. такого спагетти который IAR там генерил я еще ни разу в выхлопе GCC не видел. и оптимизации которые умеют код уменьшать в GCC тоже отсутствуют.
arm/thumb? какого типа код/проект?
народ говорит что thumb подтормаживает по сравнению с arm кодом.
О_о. А как глобальные структуры создают избыточность?
то что я делал это переделать часто используемую `a->b->c` на `a.b->c`. другой паря потом соптимил `a.b.c`. т.е. все указатели считаются во время компиляции. в сумме сэкономило почти 3К на 100К кода (ARM, Thumb).
я точно не считал, но в том конкретном случае часть проблемы (и может быть самая большая) была то что структуры были относительно большими. а ARM/Thumb умеет непосредственные константы в инструкциях только 0-255. большие смещения поэтому компилеру приходилось как безымянные переменные хранить и генерить дополнительный код для их чтения.
P.S. А разве доступ к a.b.c компилятор не оптимизирует в доступ тупо по констатному адресу ячейки, не складывая в рантайме &a + offsetof(b, a) + offsetof(c, b)?
сгенерит. но не для `a->b->c`. для полей `b` и `c` уже нужно хранить/вычислять отдельно смещения.