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

Поиск:

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


Эксперт
****


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

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



здесь искал http://govnokod.ru/? Не баги, но все же...


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 20.6.2012, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alca @ 20.6.2012,  18:36)
здесь искал http://govnokod.ru/? Не баги, но все же...

Периодически заглядываю. Это действительно тема для лекции, но не для этой  smile 
PM MAIL   Вверх
Earnest
Дата 20.6.2012, 21:09 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Еще надо? Из относительно недавнего; из радостей обновления компилятора.
Уже не помню с каких пор пользуюсь следующей хэш-функцией "для разброса" точек (когда точка является ключом хэш-мэпа).
Код

size_t Hash (const POINT& pt) 
{ 
      return (double)pt.x * 2531011 + (double)pt.y * 214013;
}

Ну то есть старшую часть дабла при преобразовании в инт сносит, остаток отлично разбрасывается. Т.е. так было раньше, на MSVC 6 и MSVC 2003. Переезжаем на 2008. Сразу никто ничего не заметил, ибо эффект заметен только на большом объеме данных. В общем, вдруг замечаем тормоза, которых раньше вроде бы не было: помещение точек в граф подтормаживает, когда точек много. Долго чешем репу, прежде чем догадываемся заглянуть внутрь хэш-мэпа (ну кому придет в голову ковыряться в стандартных контейнерах, которые всю жизнь работали и чего бы им теперь сломаться). И видим одну корзину... т.е. имеем вместо мэпа массив. Оказывается, умники из MS тихой сапой изменили поведение при переполнении, и теперь там какая-то константа. Долго рылась в MSDN во всяких отличиях компиляторов, но никакого упоминания об изменении этого поведения не нашла. Вот спасибо ребятам! 


--------------------
...
PM   Вверх
borisbn
Дата 20.6.2012, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Earnest, честно говоря, не очень понял... если не сложно, можешь пояснить кодом ? как было на VC-6 и как стало на MSVC-2008
и каким образом приведённая функция Hash перестала работать...


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


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(borisbn @  20.6.2012,  22:17 Найти цитируемый пост)
не очень понял... если не сложно, можешь пояснить кодом ? как было на VC-6 и как стало на MSVC-2008

borisbn, меня, тоже очень заинтересовал этот момент. По случаю под рукой оказалась как VC-6, так и MSVC-2008.
Итак, тестовая программка:
Код

int main ()
{
   for (int i = 0; i < 10; ++ i)
   {
      double val = i * 1000000000.0;
      int overflowed = (int) val;
      printf ("%2d = %08x\n", i, overflowed);
   }   
   return 0;
}

Выход VC-6:
Код

 0 = 00000000
 1 = 3b9aca00
 2 = 77359400
 3 = b2d05e00
 4 = ee6b2800
 5 = 2a05f200
 6 = 65a0bc00
 7 = a13b8600
 8 = dcd65000
 9 = 18711a00


Выход MSVC-2008:
Код

 0 = 00000000
 1 = 3b9aca00
 2 = 77359400
 3 = 80000000
 4 = 80000000
 5 = 80000000
 6 = 80000000
 7 = 80000000
 8 = 80000000
 9 = 80000000


Выход gcc, совпадает с MSVC-2008, пруф

Но, во всех трех случаях, упрекнуть создателей компиляторов абсолютно не в чем! smile
поскольку стандарт (как всегда!), нифига не стандартизирует:
Цитата(ISO/IEC 14882:2011)

4.9 Floating-integral conversions
1. A prvalue of a floating point type can be converted to a prvalue of an integer type. The conversion truncates; that is, the fractional part is discarded. The behavior is undefined if the truncated value cannot be represented in the destination type.

Earnest. Интересный баг, спасибо. Не знал про него.

PM MAIL   Вверх
feodorv
Дата 21.6.2012, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(xvr @  19.6.2012,  13:47 Найти цитируемый пост)
Интересны баги в программах (желательно своих). 

Мои баги не столь интересны, тем более по последствиям. А вот если рассказать несколько исторических баек на эту тему, то кмк будет веселее. Прямо начиная от происхождения слова баг и т.п.
10 худших багов в истории человечества (правда, там моль благородно названа "мотыльком")...
Изучение знаменитых (и не очень знаменитых) ошибок

Это сообщение отредактировал(а) feodorv - 21.6.2012, 06:05


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Earnest
Дата 21.6.2012, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(volatile @  21.6.2012,  01:20 Найти цитируемый пост)
Но, во всех трех случаях, упрекнуть создателей компиляторов абсолютно не в чем! 

Да, разумеется, это UB в принципе. Т.е. теоретически. Но дело в том, что в незапамятные годы я списала это где-то как пример хорошей хэш-функции для  2-х и более компонентных ключей. Тогда над UB задумываться было не модно. И оно работало как надо. Это такая маленькая часть кода, и так давно работающая, что воспринималась как нечто само собой разумеющееся.
borisbn, volatile привел вполне показательные данные. Только в моем случае в 2008 были сплошные 0х80000000, т.к. координаты немаленькие.
Да, они, конечно, имели право, но хоть бы написали где-нибудь пару слов. Дело в том, что это было не единственное тихое изменение поведения. И много-много радостей по этому поводу. Т.е. набор опций проекта, который нормально работал в 2003, стал по-другому работать в 2008. 
Например, еще поменяли выравнивание секций в образе по умолчанию, и у меня защита развалилась. Да к тому же "забыли" описать опцию, которая это дело помогает починить. 

 smile 
Ненавижу, когда приходишь в привычный супермаркет за молочком-хлебушком, а там опять все переставили. И ходишь как дура между рядами, ищешь свой хлебушек, вместо того чтобы валить по более важным делам. Я понимаю, зачем это делается, хотя на меня действует обратным образом: когда я в злобе, я покупаю меньше. Но зачем разработчики компиляторов непрерывно все "переставляют", для меня загадка. Не иначе как для того, чтобы нам скучно не стало.


--------------------
...
PM   Вверх
Earnest
Дата 21.6.2012, 06:57 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Еще вспомнилось, уже из древних времен. Если кто помнит, во времена доса и светлой памяти турбо С готового функционала для работы с мышью не было. Полагалось писать что-то вроде драйвера, вроде называлось это резидентной программой. Поскольку она могла получить управление в любой момент, ей полагалось перед работой сохранить значения регистров, а потом восстановить. Программка простая, пара десятков строк на ассемблере. Тоже из серии "написали и забыли". Ну и вот, после 2-3 лет жизни на 286-х компьютерах наступает светлая эпоха 386-го процессора. ОС и программы остаются 16-разрядными, основная программа на С++, поэтому замены одного ящика на другой я особо не замечаю. И вот в мышином резиденте остается сохранение\восстановление 16-разрядных регистров. При этом,  программа в основном работала нормально (видимо, старшая часть регистров имела значение не часто). Но иногда ее начинало вдруг глючить. Зависело это, похоже, исключительно от расположения звезд: она могла работать целыми днями без эксцессов. Попытка выловить баг отладкой напоминала погоню за горизонтом: только вроде находишь место падения, ставишь туда точку прерывания, а она валится совсем в другом, где раньше работала. Жуть, в общем. Несколько дней я убила на погоню за тенью, пока случайно не вспомнила про мышиный драйвер и не посмотрела, как там регистры сохраняются.




--------------------
...
PM   Вверх
boostcoder
Дата 21.6.2012, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Earnest @  21.6.2012,  06:31 Найти цитируемый пост)
а там опять все переставили.

но в некоторых супермаркетах это обычное дело ;)
страшно, если в компиляторах/стандартах все станет также smile 
PM WWW   Вверх
500mhz
Дата 21.6.2012, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



Цитата

 Ну и вот, после 2-3 лет жизни на 286-х компьютерах наступает светлая эпоха 386-го процессора. ОС и программы остаются 16-разрядными, основная программа на С++, поэтому замены одного ящика на другой я особо не замечаю. И вот в мышином резиденте остается сохранение\восстановление 16-разрядных регистров

И что , мсдос в real mode работает и там 16 разрядные регистры будут хоть на атлоне 64. Так что баг не в смене проца был.


--------------------

PM MAIL ICQ   Вверх
Earnest
Дата 21.6.2012, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Да, я еще забыла сказать, что после перехода на 386 проц компилятору включили соответствующую опцию (что можно использовать его команды). Речь, конечно, не идет о том, что старая прога, которая работала под 286, перестала работать под 386. Программа, разумеется, перекомпилировалась под 386 и вообще продолжала развиваться. 


--------------------
...
PM   Вверх
xvr
Дата 21.6.2012, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(feodorv @  21.6.2012,  05:57 Найти цитируемый пост)
А вот если рассказать несколько исторических баек на эту тему, то кмк будет веселее.

Это я уже собрал, хотелось бы чего то не столь распространенного по сети  smile 

PM MAIL   Вверх
borisbn
Дата 21.6.2012, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



volatile, спасибо. Хорошо объяснили. Всё понятно.

Earnest, тоже спасибо за очередное напоминание, что UB не должно быть в программе ни в коем случае. Даже если оно и работает...
А баг с мышкой - жеееесть. Хоть, наверное, за давностью лет и не имеет смысла, но сочувствую  smile 

Это сообщение отредактировал(а) borisbn - 21.6.2012, 13:27


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


Эксперт
****


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

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



Итак, лекцию прочел. Хотя не успел перевести весь сопроводительный текст, кидаю как есть.
Когда текст доделаю, кину еще раз отдельно


Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  bugs.zip 786,61 Kb
PM MAIL   Вверх
Silent
Дата 29.6.2012, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 9



Уже, наверное, не актуально, но на потом - 90гг, трабла между передачей параметров из кода MS в код Borland, при передаче двухбайтных параметров:
все параметры при передаче выравниваются по границе 4 байта, и код от одного производителя считает значимыми младшие два байта, а код второго производителя - что значимые старшие. Меняем размерность передаваемого параметра на int - и все работает. Недавно на такую же штуку кто-то с хабра наткнулся, при попытке компилировать на gcc под ARM
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0620 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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