Читаем Bash.org.ru IT Happens Истории ## 9201 – 9300 полностью

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

Тут-то и оказалось, что я не субсубподрядчик — всё значительно хуже. Оказалось, что в одной фирме города N. произошла беда, и они сразу же попросили помощи у фирмы, которая обеспечивала поддержку. Фирма была aвстрийская. Те сразу же перебросили таск в пул, и баг попал на Украину. Там что-то случилось, но в итоге задача улетела в Индию. Индусы уже давно сами код не писали, а подряжали китайцев, а у тех специалистом по данному вопросу был я.

На этом бы история в нормальных условиях и закончилась, но в дело вступил принцип глухого телефона. Переписка была, мягко говоря, активная, мозг на исходе седьмого дня буквально проели, и я высказался: не проще ли, мол, мне самому съездить и на месте решить?

Короче, всю глубину творящегося идиотизма я прочувствовал, когда заявился в головной офис, а там меня ждал — не админ, нет, а целый технический директор с переводчиком. Там я скромно упомянул, что русским языком владею свободно. Директор очень обрадовался: вот, дескать, сервис в Европах, со знанием языка специалистов присылают! После этого меня уведомили, что гостиницу для меня забронировали и даже оплатили. Мол, если быстро почините, и культурная программа будет.

Как вам ситуация: обычный PHP-шник, не выезжая из родного города, умудряется попасть в международную командировку, где чинит софтину стоимостью в несколько зелёных килоенотов? Да-да, я тоже в шоке.

<p>#9273: Не очень ноль</p>

15:00 27.05.2012, IT happens

Когда я учился на втором курсе одного белорусского университета, преподаватель физики предложила всем желающим принять участие в студенческой научно-практической конференции. Для этого требовалось написать программу, моделирующую какой-нибудь физический процесс. Поскольку от избытка любви к предмету я не страдал, а участие означало автомат на экзамене, моё решение было очевидным.

Моделировать пришлось связанные колебания маятников. Первый вариант программы я наскоро набросал на Delphi — для университетской конференции этого хватило. А затем была подготовка к такому же мероприятию, но уже между университетами. Поскольку времени хватало, я взялся переписать программу на FASM, заодно сохранив совместимость программы с Windows 95/98. Через несколько месяцев получилась вполне приличная 3D-модель с управлением параметрами системы, скоростью и направлением течения времени, возможностью подключать модели других физических процессов и прочими вкусняшками.

Проверка программы на моём собственном ноутбуке и на ноутбуках друзей-знакомых прошла на ура. А вот на домашнем компьютере (Win98) дальше выбора модели программа работать не захотела. Разумеется, всё оставшееся время было посвящено отладке. Правда, сам по себе проект уже начал надоедать, да и желания выходить с ним за пределы университета не было, поэтому в конце концов, так и не найдя ошибки, я понадеялся на русский авось и отдал программу как есть. Мне повезло: у организаторов программа не запустилась, но автомат за последний семестр физики уже был в кармане.

А полгода спустя ранним утром я, как обычно, шёл на первую пару. Мысли огромным роем носились в голове, сменяя одна другую. И вдруг я понял, в чём заключалась моя ошибка. Дождаться вечера, чтобы проверить догадку, было нелегко.

Поскольку в основном программа работала с вещественными числами, регистров общего назначения хватало с запасом. Чтобы подсократить размер экзешника, в самом начале программы я обнулял регистр EBX и использовал его везде, где это возможно, вместо константы 0. Всё тот же STDCALL этого не запрещает: вызываемые функции значение этого регистра сохраняют, так что оказалось действительно удобно. Есть только одна проблема: внутри себя функции WinAPI этот регистр активно используют, а соглашение вызова не обязывает их восстанавливать его значение перед вызовом callback-функций.

Моя ошибка оказалась в том, что в оконной процедуре (а с точки зрения User32.dll она как раз и есть callback) я забыл прописать явное обнуление EBX. На тех компьютерах, где программа работала корректно, мне просто везло: значение регистра оставалось нулевым. На остальных же системах там оказывалось ненулевое значение, которое успешно использовалось вместо всех нулей во многих процедурах программы. Одна строчка кода, два байта в экзешнике — полгода спустя они обрели своё место в коде, но было уже поздно.

Обнуляйте переменные и регистры — и будет вам счастье!

<p>#9274: Заразите всё обратно</p>

13:00 28.05.2012, IT happens

Звонок от одного из пользователей:

— Алло, как закрыть антивирус, не сохраняя?

Долгое молчание на нашей стороне.

<p>#9275: Глюков не видать</p>

13:00 28.05.2012, IT happens

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

Перейти на страницу:

Все книги серии Bash.org.ru IT Happens

Похожие книги