Re[4]: Искусство писать глюки
От: Awaken Украина  
Дата: 23.05.03 07:15
Оценка:
KS>Это да... вот у нас в конторе есть один специфический тип отчета по неким данным... Спустя пару лет после его >написания, выяснилось, что неправильно был реализован математический алгоритм, считающий ряд стандартных статистик. >Но все заказчики давно привыкли к тем цифрам, и правильный вариант их категорически не устроил... Так и продаем до

в любой большой системе есть некоторое количество багов, иногда получается так что некоторые из них "взаимоуничтожают" друг друга и все работает правильно.
Re[5]: Искусство писать глюки
От: ArtDenis Россия  
Дата: 23.05.03 07:44
Оценка: 10 (5) :))
Здравствуйте, Awaken, Вы писали:

KS>Это да... вот у нас в конторе есть один специфический тип отчета по неким данным... Спустя пару лет после его >написания, выяснилось, что неправильно был реализован математический алгоритм, считающий ряд стандартных статистик. >Но все заказчики давно привыкли к тем цифрам, и правильный вариант их категорически не устроил... Так и продаем до


A>в любой большой системе есть некоторое количество багов, иногда получается так что некоторые из них "взаимоуничтожают" друг друга и все работает правильно.


Довольно распростронённое убеждение. Но не стоит забывать, что содержание системы не равно сумме содержаний компонентов. И учитывая это замечание, можно найти несколько типичных баговых ситуаций (и пути их решения):

1. Проявление_багов = баг1 - баг2 + баг3 - баг4 + ... -багn;

где n — чётное число.
Эта самая благоприятная ситуация для программиста. Особый случай ситуации — когда сумма положительных багов равна сумме отрицательных. В этом случае баги никиа не влияют на работу программы. Задача программиста в этом случае — стараться делать одинаковые по проявлению баги и следить, чтобы сумма багов была чётным числом.

2. Проявление_багов = баг1*баг2*баг3*баг4* ... *багn;

где n — любое целое число.
Это тоже очень распространённая ситуация. В этом случае — задача программиста — свести хотя-бы один баг к нулю или бесконечно малому значению.

2. Проявление_багов = баг1^баг2;

Это уже более серьёзная ситуация. Есть два решения такой проблемы.
1. Попытаться свести баг1 к нулю. Задача, как правило, невыполнимая, т.к. почти всегда баг1 не поддаётся локализации.
2. Прологарифмировать Проявление_багов. В этом случае пропадает экспоненциальная зависимость от 2-го бага.

Как правило, в реальности встречаются все три ситуации в перемешку. Задача программиста — свести Проявление_багов к минимуму, использую вышеприведённые примеры.

(с) Я.
... << RSDN@Home 1.0 beta 7a >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Искусство писать глюки
От: Всеволод Россия  
Дата: 26.05.03 11:58
Оценка:
Здравствуйте, sercher, Вы писали:



S>Господа программисты.


S>А почему бы нам не сделать конкурс на самый глючный баг? Ведь чем сложнее и трудноуловимее баг, тем профессиональнее считается программист. Вот примеры:


А еще очень долго можно искать вот такую простую ошибку:
class A
{
...
   int val;
   void Calc(void);
...
}

А потом где-нибудь в другом файле:
void A:Calc()
{
...
   int val=123+456;
...
}
Re[2]: Искусство писать глюки
От: _wqwa США  
Дата: 26.05.03 19:59
Оценка: +1
Здравствуйте, Всеволод, Вы писали:

В>А еще очень долго можно искать вот такую простую ошибку:

В>
В>class A
В>{
В>...
В>   int val;
В>   void Calc(void);
В>...
В>}
В>

В>А потом где-нибудь в другом файле:
В>
В>void A:Calc()
В>{
В>...
В>   int val=123+456;
В>...
В>}
В>


Это лечится очень просто:
class A
{
...
   int m_val; //вариант 1
   int val_;  //вариант 2
   
   void Calc(void);
...
}

Короче, явно отмечать данные-члены префиксом или суффиксом.
Кто здесь?!
Re[3]: Искусство писать глюки
От: scaramush  
Дата: 27.05.03 07:31
Оценка:
S>Но, с другой стороны, написать кусок кода длиной в ~20 строк, содержащий заведомый баг, и при этом неочевидный — это тоже своего рода искусство.

Есть вообще высший пилотаж: кусок кода длинной ~20 строк, при взляде на который понимаешь, что он явно содержит ошибки... на самом деле ошибок не содержащий. Во как!
Re[4]: Искусство писать глюки
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.05.03 11:47
Оценка: -1 :)
Здравствуйте, scaramush, Вы писали:

S>Есть вообще высший пилотаж: кусок кода длинной ~20 строк, при взляде на который понимаешь, что он явно содержит ошибки... на самом деле ошибок не содержащий. Во как!

Да ну! Мне студенты постоянно такой код сдают.
... << RSDN@Home 1.0 beta 7a >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Искусство писать глюки
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.05.03 15:51
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Вообще конечно да. В жизни хороший баг распределен как минимум по трем исходникам, достаточно далеко разнесенным по структуре проекта, и каждый в отдельности никаких подозрений не вызывает.

Однажды на ежемесячном собрании я получил премию от компании за нахождение фатальной ошибки перезаписи памяти, которая была ошибкой "седьмого уровня", а именно, указатель, превращенный в мусор перезаписью поверх него другого валидного (но неверного) указателя, приводил к разрушению другого указателя, что приводило к неверному вычислению индекса, что приводило ... — и так разрушения до седьмого уровня, что в конце-концов вызывало фатальную ошибку доступа. Т.к. для данной системы не было возможности сгенерировать финальную версию с отладочной информацией, я провел чистых 17 часов, пошагово исполняя инструкции, отслеживая обратные связи, и последовательно сужая зону поиска. У меня было 2 терминала — на одном исполнялась отладочная, а на другом финальная версии программы. После того, как я нашел ошибку, по отладочной версии было очевидно, что происходило не так, но в неоптимизированном коде описанное выше явление скрывало истинную ошибку.

Как пережить release-версию
Автор(ы): Dr. Joseph M. Newcomer
Дата: 18.06.2001
Статья посвящена проблемам перехода с Debug-версии на Release-версию. Рассматриваются
типичные ошибки, которые могут не проявляться в отладочной версии, но проявляются в финальной.
Обсуждается вопрос "ошибок компилятора" и вопросы необходимости оптимизации и ее побочные эффекты.
В последней редакции добавлен раздел посвященный проблеме совместимости динамических библиотек.
, Dr. Joseph M. Newcomer
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Искусство писать глюки
От: Lonely Dog Россия  
Дата: 31.05.03 16:14
Оценка:
Здравствуйте, ArtDenis, Вы писали:

---покусано----

Предлагаю придумать новую науку: Баговедение. Во время изучения этой науки студенты будут обучаться исскуству планирования багов, и пр.

PS: народ, предлагайте новые направления этой науки...
Re[7]: Искусство писать глюки
От: ArtDenis Россия  
Дата: 01.06.03 05:23
Оценка: 5 (2)
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, ArtDenis, Вы писали:


LD>---покусано----


LD>Предлагаю придумать новую науку: Баговедение. Во время изучения этой науки студенты будут обучаться исскуству планирования багов, и пр.


LD>PS: народ, предлагайте новые направления этой науки...


Только не Баговедение, а БагоЛогия.

Выписка из статьи газеты "Практическая БагоЛогия":

Российская Академия Багологии дистанционно присвоила звание Профессора багологических наук Биллу Калиткину...

... << RSDN@Home 1.0 beta 7a >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Искусство писать глюки
От: Eugene Kilachkoff Россия  
Дата: 01.06.03 11:48
Оценка:
Здравствуйте, sercher, Вы писали:



S>Господа программисты.


S>А почему бы нам не сделать конкурс на самый глючный баг? Ведь чем сложнее и трудноуловимее баг, тем профессиональнее считается программист. Вот примеры:

Вот вы говорите, баги... А у нас в институте народ, натурально, сдает вот такое:

TSPRab = class(TFRSP)
  public
    function MXTheor: TReal; virtual; abstract;
    function DXTheor: TReal; virtual; abstract;         // теор. DX
    // к-т асимметрии
    function Assym: TReal; virtual; abstract;
    // к-т эксцесса
    function Excess: TReal; virtual; abstract;
    procedure Model(ALength: Integer; A, B: TReal); reintroduce;
  end;
{-----------}
implementation

var
  Y,X: TArrayX;
  a, b, mu, mu3, mu4, gamma, alpha, betta, sigma: Real;
  i:word; //счетчик

function SPRab.MXTheor;
begin
MXTheor:=(a+b)/2;
end;

function SPRab.Assym;
begin
KATheor:=0;
end;
{-----------}
Function SPSimp.Model;
begin
For i:=1 to N do
     if Random=0 then FArrayX[i]:=a else
 if (Random>0) and (Random<0.5) then FArrayX[i]:=(b-a)*sqrt(X[i]/2)+a else
    if (Random>=0,5) and (Random<1) then
              FArrayX[i]:=b*sqrt((1-X[i])/2)*(b-a) else
                    if Random=1 then FArrayX[i]:=b;
end;
{-----------}
function SPVeyb.Assym;
begin
mu3=(Г(1+3/alpha)- 3*Г(1+1/alpha)* (Г(1+2/alpha)+2*Г{в кубе}(1+1/alpha))
*betta{в степени -2/alpha??}) *betta{в степени -3/alpha??};
KATheor:=mu3/DXTheor{в степени 3/2};
end;
Re[7]: Искусство писать глюки
От: scaramush  
Дата: 02.06.03 08:46
Оценка:
LD>Предлагаю придумать новую науку: Баговедение. Во время изучения этой науки студенты будут обучаться исскуству планирования багов, и пр.

Ага. А в качестве отца-основателя забрать у Шендеровича врача мозговеда Бильжо.
Re: Искусство писать глюки
От: the_moon  
Дата: 02.06.03 15:25
Оценка:
Здравствуйте, sercher, Вы писали:


Самый смешной баг была "ленивая" программистка. Был как то баг, в качестве параметра передавалась единичка в место нуля. Так вот эта программистка с этим не стала разбираться, а решила, что проблема эта из за отсутствия нужной функции. Она ее написала, а неправильный вызов с еденичкой выкинула. Ну и началась потом свистопляска, она этот баг пофиксила, а на его месте появился другой. Она его тоже зафиксила и так это длилось полтора месяца и пока она не написала копию той функции вызов которой она закоментировала в самом начале. Потом она ушла, а посадили меня и я неделю удалял, то что она там накОдила, что бы потом в итоге поменять 1 на 0 в уже существующей функции.
KOPOTbILLIKA KPbIC
Re: Искусство писать глюки
От: ch00k  
Дата: 03.06.03 16:01
Оценка: 71 (6)
Здравствуйте, sercher, Вы писали:


S>Господа программисты.


S>А почему бы нам не сделать конкурс на самый глючный баг? Ведь чем сложнее и трудноуловимее баг, тем профессиональнее считается программист. Вот примеры:



class Test 
{
   int x, y, char * s;

public:
   Test(int a_x, int a_y, const char * a_s) { x = a_a; y = a_y; s = a_s; }
   Test(const Test & t)                     { *this = t };
   Test & operator=(const Test t)           { x = t.x; y = t.y; s = strdup(t.s); return *this; }
};

int main()
{
   Test t1(0, 0, "test1");
   Test t2 = t1; 
   return 0;
}


Stack overflow
Это, кстати, еще и пример извращенности мышления...
Re[2]: Искусство писать глюки
От: Кодт Россия  
Дата: 03.06.03 17:02
Оценка:
Здравствуйте, ch00k, Вы писали:

C>   Test & operator=(const  Test  t)           { x = t.x; y = t.y; s = strdup(t.s); return *this; }

C>Stack overflow
Долго хлопал глазами, потом как дошло, аж больно стало!!!

C>Это, кстати, еще и пример извращенности мышления...

Необязательно: copy-ctor и operator= могут, к примеру, вызывать функцию assign(), которая объявлена именно с такой плюшкой.
Перекуём баги на фичи!
Re: Искусство писать глюки
От: FWP Россия  
Дата: 04.06.03 11:16
Оценка:
Здравствуйте, sercher, Вы писали:



S>Господа программисты.


S>А почему бы нам не сделать конкурс на самый глючный баг? Ведь чем сложнее и трудноуловимее баг, тем профессиональнее считается программист.

У меня на C++ самый популярный баг
{
  ...
  retrun;
}

Никак не могу его победить
Re[2]: Искусство писать глюки
От: Nose Россия  
Дата: 04.06.03 11:34
Оценка:
Здравствуйте, FWP, Вы писали:

FWP>Здравствуйте, sercher, Вы писали:


FWP>
FWP>{
FWP>  ...
FWP>  retrun;
FWP>}
FWP>

FWP>Никак не могу его победить

угу, у меня то же самое... Только это не баг. Это так, фигня... сразу ведь находится.
... << RSDN@Home 1.0 beta 7a >>
Re[2]: Искусство писать глюки
От: joker6413  
Дата: 16.06.03 05:59
Оценка:
Здравствуйте, ch00k, Вы писали:

C>Здравствуйте, sercher, Вы писали:



S>>Господа программисты.


S>>А почему бы нам не сделать конкурс на самый глючный баг? Ведь чем сложнее и трудноуловимее баг, тем профессиональнее считается программист. Вот примеры:



C>
C>class Test 
C>{
C>   int x, y, char * s;

C>public:
C>   Test(int a_x, int a_y, const char * a_s) { x = a_a; y = a_y; s = a_s; }
C>   Test(const Test & t)                     { *this = t };
C>   Test & operator=(const Test t)           { x = t.x; y = t.y; s = strdup(t.s); return *this; }
C>};

C>int main()
C>{
C>   Test t1(0, 0, "test1");
C>   Test t2 = t1; 
C>   return 0;
C>}

C>


C>Stack overflow

C>Это, кстати, еще и пример извращенности мышления...

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

Игорь
Re[2]: Искусство писать глюки
От: Аноним  
Дата: 16.06.03 06:36
Оценка: :))
Из подобных "багов" я частенько пишу
ша (...)
{
}

Правда сразу же исправляю...
Re[3]: Искусство писать глюки
От: Apostate  
Дата: 16.06.03 09:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Из подобных "багов" я частенько пишу

А>
А>ша (...)
А>{
А>}
А>

А>Правда сразу же исправляю...

тоже самое, условия часто сопровождаются предварительными комментариями, а они на русском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.