Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какие у вас бывали баги? 
V
    Опции темы
xvr
Дата 19.6.2012, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Господа, меня тут озадачили лекцией в МГУ на тему багов и их последствий (на 1.5 часа). Чувствую, что моих запасов на столько не хватит  smile 
Поэтому прошу общественность поделится интересными (и главное необычными) багами, которые встречались в вашей практике. 
В основном интересуют конечно программные баги (из мира С/С++), но и любые другие (вплоть до багов аппаратуры) подойдут.

Вот, к примеру, баг из моей коллекции -

Было это в конце 80х, когда самой крутой PC была '386я с сопроцессором'. И была написанна маленькая программа, которая что то считала и выводила несложную графику (все в DOS). У меня все работало замечательно, а вот у заказчика оно свалилось с сообщением 'Not enough memory' (что было очень странно, т.к. этой самой memory ей было нужно совсем не много). Попытка взять машину с памятью побольше успехом не увенчалась. Раскопки с TurboDebugger'ом показали удивительную вещь:
Программа использовала вычесления с плавающей точкой для расчета размеров (и площади) фигур, которые она пыталась нарисовать. По подсчитанной площади делался malloc - для выделения памяти под растр. В машине отсуствовал сопроцессор, а в программе отсуствовала проверка на его наличие  smile В результате все вычисления с плавающей точкой были проигнорированны, и в malloc свалился 0, что и вызвало выдачу NULL и как следствие ругань на нехватку памяти.

В моей практике это первая и (пока) последняя такая связь причины ошибки и диагностики, которая была выданна  smile 

PM MAIL   Вверх
Dem_max
Дата 19.6.2012, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Ну если интересно в Builder по крайней мере знаю 3 бага


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xvr
Дата 19.6.2012, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Dem_max @ 19.6.2012,  12:41)
Ну если интересно в Builder по крайней мере знаю 3 бага

Интересны баги в программах (желательно своих). Или вы автор Builder'ов?

PM MAIL   Вверх
boostcoder
Дата 19.6.2012, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



1. баг недостаточного времени жизни объекта. несколько дней назад мне порвал моцг smile 
такой функциональный объект постится в io_service:
Код

struct sender {
   void operator()() {
      socket.async_write(..., handler, ....);
   }

private:
   void handler(...) {
   }
   asio::socket socket;
};

происходило следующее:
когда очередь io_service`а доходила до объекта этого типа, вызывался его operator(), в котором создавалась асинхронная запись использующая в качестве хендлера метод handler() этого же объекта. но проблема тут в том, что после вызова operator(), io_service удаляет из очереди этот объект, и объект разрушается. но как же быть с хендлером? smile 
этот код отлично работал в линуксе. но когда его собрали для вянды - начились приключения.

PM WWW   Вверх
boostcoder
Дата 19.6.2012, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



2. про мотиву первого.
имеется такой объект:
Код

struct timer {
   ~timer() {
      _timer.cancel();
   }

   void handler(...) {
   }

private:
   asio::deadline_timer _timer;
};

происходит следующее:
при разрушении объекта этого типа, вызывается cancel() у таймера.
если таймер в это время был взведен, то согласно доке, хендлер должен вызваться с error_code равном operation_canceled. но проблема в том, что вызов deadline_timer::cancel() не напрямую вызывает указанный хендлер, а при помощи io_service`а. таким образом, хендлер вызывался после того как объект уже был разрушен. плюс еще одна проблема в том, что состояние объекта-члена-данных _timer после разрушения объекта типа timer - оказывалось неопределенным. и поэтому баг воспроизводился по разному smile 
PM WWW   Вверх
xvr
Дата 19.6.2012, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(boostcoder @  19.6.2012,  12:54 Найти цитируемый пост)
баг недостаточного времени жизни объекта.

Цитата(boostcoder @  19.6.2012,  13:34 Найти цитируемый пост)
про мотиву первого.

Это проблема учета времени жизни объектов. Ничего 'необычного' в них пока не вижу, надо что нибудь более яркое.

Я на эту тему видел один, ну если не баг, то 'фичу' точно (автор сделал это нарочно, так что не баг  smile )
Была та же проблема - после разрушения объекта (причем явного - через delete), к нему иногда позже могли обратится (а могли и не обратится). В результате, вместо того, что бы разбираться со временем жизни объекта, аффтор сделал пустой деструктор и перебил объекту оператор delete, в котором проверял - а не может ли этот объект еще понадобтся? Если мог понадобится, то память не отдавалась, и позже на этот же объект еще раз вызывался delete (на этот раз память отдавалась).  smile 
После того, как автору надавали по ушам за такой оригинальный 'менеджер памяти' он таки переделал это место по нормальному  smile 

PM MAIL   Вверх
boostcoder
Дата 19.6.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(xvr @  19.6.2012,  13:59 Найти цитируемый пост)
Ничего 'необычного'

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

PM WWW   Вверх
xvr
Дата 19.6.2012, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(boostcoder @  19.6.2012,  14:12 Найти цитируемый пост)
а что означает "необычный баг" ?

Под 'необычным' я понимаю такой, что бы его можно было рассказать минимально заинтересованной и совершенно технически не подкованной аудитории, не усыпив при этом половину слушателей  smile 

NB. Проблему неопределенного времени жизни я обязательно упомяну, так что за баги спасибо (хотя их самих я пожалуй упоминать не буду - 90% аудитории просто не поймет, в чем дело  smile )

PM MAIL   Вверх
Alexeis
Дата 19.6.2012, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  Могу поделиться такой вот классикой (Код не оригинальный )
Код

  for (size_t i = 0; i < container.size(); i++)
  if (BadElement(container[i]))
    container.erase(container.begin() + i);

  Такой код в принципе работает, но иногда в программе появляются чудеса. Если удалять нужно 2 подряд идущих элемента, то i++ благополучно обходит второй.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 19.6.2012, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  Еще немного из классики.

1)
Код

  if (<expr1> ||  <expr2>)
    ....


В общем случае не тоже самое что и 

2)
Код

  bool c = <expr1> ||  <expr2>;
  if (c)
    ....


Суть в том, что первоначально код написан как 1) , затем код модифицируется до 2) . Вроде как полный эквивалент, однако ж нет. В 1м случае если <expr1> == true , то <expr2> даже не вычисляется. Во втором же случае порядок вычисления может быть произвольным. 

 Аналогично
Код

  a = <expr1> ;
  b = a + <expr2>;
funct(a, b);


Легким движением руки превращается в 
Код

funct(а = <expr1>, a + <expr2>);

  Код который выглядит эквивалентным, но на самом деле 2й параметр может вычисляться раньше 1го.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Qu1nt
Дата 19.6.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 1
Всего: 50



По поводу первого — первый раз слышу. О_О.
PM MAIL   Вверх
Alexeis
Дата 19.6.2012, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Qu1nt @  19.6.2012,  16:25 Найти цитируемый пост)
По поводу первого — первый раз слышу. О_О. 

  Ни разу не делал таких ошибок? Или не знал что это ошибка?  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
borisbn
Дата 19.6.2012, 16:31 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Я как-то пробовал собрать грабли, на которые все наступали - http://forum.vingrad.ru/forum/topic-346611/view-all.html
вот история (из той же темы), с которой я сам столкнулся:

Как-то 29 марта (это существенно) подходит ко мне молодой коллега Дима и говорит, что наша программа не пишет в БД. Я, ессно, спрашиваю "что менял" - отвечает "ничего". Ставим старую версию программы - не пишет. Ставим старую версию базы - не пишет. И так продолжалось 3 дня. 1-го апреля подходит Дима и говорит, что программа стала писать в БД. Я думал первоапрельский розыгрыш. Пошёл проверил. Старая версия программы в старую версию БД пишет. Новая - тоже...
В итоге что выяснилось: эту программу писали давным-давно ещё под DOS. Дима же переделывал её под Windows. В DOS в структуре, в которой хранится дата, месяц считается от 0, а в windows'овской структуре - от единицы. При записи в базу старый формат даты преобразовывался в новый без учёта этой особенности. Таким образом получалось, что мы пытались записать в БД 29 февраля, затем 30-е, затем 31-е... СУБД отказывалась воспринимать эти даты, а вот первое марта - пожалуйста.
Как никто не заметил, что дата в БД отличается на месяц - не знаю


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Qu1nt
Дата 19.6.2012, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 1
Всего: 50



Alexeis, 
Цитата

The && operator groups left-to-right. The operands are both implicitly converted to type bool (clause 4). The result is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.

То есть в любом случае гарантируется порядок вычислений.

Это сообщение отредактировал(а) Qu1nt - 19.6.2012, 16:39
PM MAIL   Вверх
borisbn
Дата 19.6.2012, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Qu1nt @  19.6.2012,  16:39 Найти цитируемый пост)
То есть в любом случае гарантируется порядок вычислений.

ага. пруф - http://liveworkspace.org/code/7a681a5dd8e3...bf434e2e6ed8ecf


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.