zHz00 Untitled

пятница, 07 июля 2017
23:56 Докажи, что ты не верблюд
Есть два измерительных модуля в одном из приборов, которые мы делаем -- Module1 и Module2. Меряют разные характеристики. Один давление, другой температуру.

Разные экземпляры прибора могут быть укомплектованы разным набором модулей. И вот данный конкретный экземпляр имел только Module2. И его эксплуатировали 4 месяца не включая этот модуль. Но понадобилось включить. И оказалось, что модуль не работает.

Начинаю отлаживать ПО. И вижу картину маслом:

void InitModule2()
{
if(Settings.bModule1Installed==false)
return;
//далее инициализация модуля2
}


То есть: если в приборе НЕ установлен модуль 1 (а он и не был установлен), прекратить инициализацию модуля 2! Модули более-менее независимы. Это меня удивило. Я сделал svn blame. Эта команда позволяет установить, кто является автором каждой строчки кода (и у неё есть синоним -- svn praise, лол). В результате этого я выяснил, что данную строчку написал начальник. Как раз 4 месяца назад. И тогда же обновляли ПО на данном приборе.

Я подумал, может быть в этом есть глубокий смысл? Спросил его. Но оказалось, что это всего-навсего последствия невнимательного копипаста при рефакторинге. В первом модуле текст был правильным. Инициализация отличалась несильно. Поэтому начальник просто скопировал текст инициализации первого модуля и подправил нужные места. Но не все...

@темы: Программирование, Говнокод, Борьба с техникой

URL
Картинка. Два часа ночи. Тесная улица с бесконечными р...
"Невозможного нет, есть только непонимание возможног...
Пытаясь влиться в круг волчиц Невольно подумай о жизни ...
Свобода зависит в том, что бы зависить только от законов....
Сегодня из-за утренного недостатка адреналина :o были п...
Валентин, 37, рост 172, вес 40. Уже 10 лет не есть мяс...

08.07.2017 в 10:01

08.07.2017 в 10:01
Только вчера искал ошибку. Нашел. Выяснилось, что я ранее переписал чужую функцию, в которой был примерно такой switch:

switch( condition )
{
case a: return aaa;
case b: return bbb;
...
}

Я таких вещей не люблю, поэтому я сделал "нормально":

Type res;

switch( condition )
{
case a: res = aaa;
case b: res = bbb;
...
}

return res;

Но я совершенно не заметил, что в оригинальном варианте не было ни одного брейка! На автомате заменил все ретурны на присваивание и успокоился. А свитч после этого стал пробегать по всем веткам!
URL

08.07.2017 в 15:06

08.07.2017 в 15:06
Да. switch -- одна из бед Си. Посему я всегда в каждой секции пишу брейк, даже если до него стоит ретёрн. И даже если это последняя секция свитча. Исключение -- случаи типа такого:
switch(c)
{
case 1:
case 2:
action1();
break;
case 3:
action2();
break;
}

Тут после первого кейса я, естестественно, брейк не ставлю, т.к. так и задумано.
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии