![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
здесь искал http://govnokod.ru/? Не баги, но все же...
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Периодически заглядываю. Это действительно тема для лекции, но не для этой |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Еще надо? Из относительно недавнего; из радостей обновления компилятора.
Уже не помню с каких пор пользуюсь следующей хэш-функцией "для разброса" точек (когда точка является ключом хэш-мэпа).
Ну то есть старшую часть дабла при преобразовании в инт сносит, остаток отлично разбрасывается. Т.е. так было раньше, на MSVC 6 и MSVC 2003. Переезжаем на 2008. Сразу никто ничего не заметил, ибо эффект заметен только на большом объеме данных. В общем, вдруг замечаем тормоза, которых раньше вроде бы не было: помещение точек в граф подтормаживает, когда точек много. Долго чешем репу, прежде чем догадываемся заглянуть внутрь хэш-мэпа (ну кому придет в голову ковыряться в стандартных контейнерах, которые всю жизнь работали и чего бы им теперь сломаться). И видим одну корзину... т.е. имеем вместо мэпа массив. Оказывается, умники из MS тихой сапой изменили поведение при переполнении, и теперь там какая-то константа. Долго рылась в MSDN во всяких отличиях компиляторов, но никакого упоминания об изменении этого поведения не нашла. Вот спасибо ребятам! -------------------- ... |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Earnest, честно говоря, не очень понял... если не сложно, можешь пояснить кодом ? как было на VC-6 и как стало на MSVC-2008
и каким образом приведённая функция Hash перестала работать... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
borisbn, меня, тоже очень заинтересовал этот момент. По случаю под рукой оказалась как VC-6, так и MSVC-2008. Итак, тестовая программка:
Выход VC-6:
Выход MSVC-2008:
Выход gcc, совпадает с MSVC-2008, пруф Но, во всех трех случаях, упрекнуть создателей компиляторов абсолютно не в чем! поскольку стандарт (как всегда!), нифига не стандартизирует:
Earnest. Интересный баг, спасибо. Не знал про него. |
||||||||||
|
|||||||||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Мои баги не столь интересны, тем более по последствиям. А вот если рассказать несколько исторических баек на эту тему, то кмк будет веселее. Прямо начиная от происхождения слова баг и т.п. 10 худших багов в истории человечества (правда, там моль благородно названа "мотыльком")... Изучение знаменитых (и не очень знаменитых) ошибок Это сообщение отредактировал(а) feodorv - 21.6.2012, 06:05 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Да, разумеется, это UB в принципе. Т.е. теоретически. Но дело в том, что в незапамятные годы я списала это где-то как пример хорошей хэш-функции для 2-х и более компонентных ключей. Тогда над UB задумываться было не модно. И оно работало как надо. Это такая маленькая часть кода, и так давно работающая, что воспринималась как нечто само собой разумеющееся. borisbn, volatile привел вполне показательные данные. Только в моем случае в 2008 были сплошные 0х80000000, т.к. координаты немаленькие. Да, они, конечно, имели право, но хоть бы написали где-нибудь пару слов. Дело в том, что это было не единственное тихое изменение поведения. И много-много радостей по этому поводу. Т.е. набор опций проекта, который нормально работал в 2003, стал по-другому работать в 2008. Например, еще поменяли выравнивание секций в образе по умолчанию, и у меня защита развалилась. Да к тому же "забыли" описать опцию, которая это дело помогает починить. Ненавижу, когда приходишь в привычный супермаркет за молочком-хлебушком, а там опять все переставили. И ходишь как дура между рядами, ищешь свой хлебушек, вместо того чтобы валить по более важным делам. Я понимаю, зачем это делается, хотя на меня действует обратным образом: когда я в злобе, я покупаю меньше. Но зачем разработчики компиляторов непрерывно все "переставляют", для меня загадка. Не иначе как для того, чтобы нам скучно не стало. -------------------- ... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Еще вспомнилось, уже из древних времен. Если кто помнит, во времена доса и светлой памяти турбо С готового функционала для работы с мышью не было. Полагалось писать что-то вроде драйвера, вроде называлось это резидентной программой. Поскольку она могла получить управление в любой момент, ей полагалось перед работой сохранить значения регистров, а потом восстановить. Программка простая, пара десятков строк на ассемблере. Тоже из серии "написали и забыли". Ну и вот, после 2-3 лет жизни на 286-х компьютерах наступает светлая эпоха 386-го процессора. ОС и программы остаются 16-разрядными, основная программа на С++, поэтому замены одного ящика на другой я особо не замечаю. И вот в мышином резиденте остается сохранение\восстановление 16-разрядных регистров. При этом, программа в основном работала нормально (видимо, старшая часть регистров имела значение не часто). Но иногда ее начинало вдруг глючить. Зависело это, похоже, исключительно от расположения звезд: она могла работать целыми днями без эксцессов. Попытка выловить баг отладкой напоминала погоню за горизонтом: только вроде находишь место падения, ставишь туда точку прерывания, а она валится совсем в другом, где раньше работала. Жуть, в общем. Несколько дней я убила на погоню за тенью, пока случайно не вспомнила про мышиный драйвер и не посмотрела, как там регистры сохраняются.
-------------------- ... |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
но в некоторых супермаркетах это обычное дело ;) страшно, если в компиляторах/стандартах все станет также |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
И что , мсдос в real mode работает и там 16 разрядные регистры будут хоть на атлоне 64. Так что баг не в смене проца был. -------------------- |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Да, я еще забыла сказать, что после перехода на 386 проц компилятору включили соответствующую опцию (что можно использовать его команды). Речь, конечно, не идет о том, что старая прога, которая работала под 286, перестала работать под 386. Программа, разумеется, перекомпилировалась под 386 и вообще продолжала развиваться.
-------------------- ... |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
volatile, спасибо. Хорошо объяснили. Всё понятно.
Earnest, тоже спасибо за очередное напоминание, что UB не должно быть в программе ни в коем случае. Даже если оно и работает... А баг с мышкой - жеееесть. Хоть, наверное, за давностью лет и не имеет смысла, но сочувствую Это сообщение отредактировал(а) borisbn - 21.6.2012, 13:27 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Итак, лекцию прочел. Хотя не успел перевести весь сопроводительный текст, кидаю как есть.
Когда текст доделаю, кину еще раз отдельно Присоединённый файл ( Кол-во скачиваний: 16 )
bugs.zip 786,61 Kb |
|||
|
||||
| Silent |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: нет Всего: 9 |
Уже, наверное, не актуально, но на потом - 90гг, трабла между передачей параметров из кода MS в код Borland, при передаче двухбайтных параметров:
все параметры при передаче выравниваются по границе 4 байта, и код от одного производителя считает значимыми младшие два байта, а код второго производителя - что значимые старшие. Меняем размерность передаваемого параметра на int - и все работает. Недавно на такую же штуку кто-то с хабра наткнулся, при попытке компилировать на gcc под ARM |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |