Ето как направих текстов редактор, който форматира хард диска след всеки 1024-ти запис на файла

Оригиналът е на GeePaw Hill

9
2861

Това е една история предназначена за начинаещите програмисти, за това, как може яко да сгафиш, и която е един нелош начин за справянето със синдрома на самозванеца.

Това бе навярно 1984-та или 1985-та година.Тогава бях 25-годишен кадърен според другите програмист с вече 5 годишен стаж. Аз и още един програмист писахме и поддържахме комплект от приложения, подобни на сегашния Office – електронни таблици, текстов редактор, база данни и т.н. Предлагахме и поддържахме тази система за няколко бизнес клиента с тясна специализация.

По-голямата част от текстовия процесор написах сам. Сорс кода писах на езика за програмиране Forth, като имах различни версии за различните варианти на процесори с операционни системи. Младите сигурно не знаят, но в тези времена новите домашни компютри със своя собствена операционна система и един от няколкото варианта процесори излизаха на всеки няколко месеца.

Forth използваше блоков обмен на данните с диска. Всеки блок бе с дължина 1 KB и за да се запише нещо по-голямо от 1 KB, трябваше да се работи с мастър блока, където се записваха всички отмествания на блоковете с данни. Всъщност, това си бяха двойка списъци със заетите и незаетите блокове.

Инициализацията на този мастър блок ставаше чрез неговото запълване с нули. И се започна. Казано по-накратко, промених своето приложение по такъв начин, че да поддържа файлове с два пъти по-голям размер, отколкото бе преди това. И по този начин в мастър блока вместо 256 елемента се появиха 1024.

Всяка операция с мастър блока изискваше – внимание! – една 16-битова дума. Ето защо, ако 512 думи се събираха в мастър блок с размер 1 KB, то 1024-те думи изискваха използването вече на два блока.

Аз смених броя на запълваните с нули блокове, а размерът на буфера не промених. А когато работиш с незащитена памет и записваш 2048 нули в пространство от 1024 байта, то останалите байтове може да презапишат много неща в паметта.

В моя случай, това „нещо“ бе мастър блокът на диска на операционната система. Да… И когато инициализирах нов файл, което ставаше на всеки 1024-ти път при запис на файл с дължина един блок, ставаше така, че се презаписваше мастър блокът на диска, което изтриваше всички файлове от системния диск.

Ние, разбира се, разпространихме именно тази версия, понеже видяхме, че в продължение на 8-9 седмици работи добре. Можете ли да си представите обажданията и броя на писмата  от недоволните клиенти, които получихме? В крайна сметка започнахме да съветваме всички да си правят резервни копия (което в тези времена ставаше на видеокасети) всеки божи ден.

В продължение на едни много дълги седмици се извинявах по телефона, като едновременно с това отново и отново пусках тази програма в дебъгера. Нищо не се получаваше. Нищо.

Един ден позвъни жена и ми държа такъв език и тон, каквито не бях чувал. Тя работеше в товарния транспорт и използваше такива нецензурни думи, които сега започнах да използвам и аз. Та така, тя по своя си начин ми обясни, че е направила резервно копие, стартирала е текстовия редактор и той веднага е изтрил всичко от нейния диск. Тя отново заредила копието, а проклетата програма отново ѝ е изтрила целия диск. Бясна беше.

Представете си, трябваха ми цели два часа, за да разбера какъв късмет съм имал. Тъкмо разказвах тази история на своя колега докато обядвахме и изведнъж ме осени – стоп, чакай малко. Веднага? Всеки път?

Аз ѝ позвъних и ѝ обещах всички земни блага, само и само да ни изпрати тази касета. Разбира се,  за моя сметка и с отмяната на всички месечни плащания за нашите услуги (шефът и за секунда не се поколеба: „Да, дявол да го вземе, ще отменим нейните плащания по абонамента и поддържането“).

Ето как можех по собствено желание да предизвикам възникването на тази грешка. Жената не лъжеше. Резервното копие, което тя ми изпрати, се оказа в критичната точка: 1023 записа на файлове към момента на създаването на архива. В този случай дискът гарантирано се изчиства.

Може би сега преувеличавам, но си спомням, че намерих тази грешка още същата сутрин, когато касетата пристигна. Колко лесно бих могъл да я открия с дебъгера!

Гледайки този блок с размер 2 KB, който трябваше да бъде записан на диска, видях, че неговият втори KB бе запълнен с някакъв боклук. Това ми се стори много странно Разбира се, това съвсем не бе боклук, а 1024-те байта на мастър блока на диска, който операционната система записваше точно до моя мастър блок на файла.

Касетата имаше резервно копие, което ми даваше гарантиран начин да възпроизведа когато желая този коварен дефект. Ако не ми бе провървяло, така и нямаше да го открия. Нямаше да се досетя, че пиша и чета в системната памет, а не във своята.

Ето как „кадърният“ гик създаде текстов редактор, който в продължение на всеки осем-девет седмици изтрива хард диска на клиента след точно на 1024-я запис на текстовия документ. Разбира се, защото изобщо не съм „кадърен“.

Моралът на тази история е ясен и от него могат да се направят два важни извода за всеки начинаещ програмист:

  1. Никога не вмъквайте в своя сорс код числови константи, освен 0 и 1
  2. Не бъдете толкова строги към себе си. Всичките наши вече премъдри разработчици и програмисти имат подобни случаи, а някои от тях и повече
4.9 12 гласа
Оценете статията
Абонирай се
Извести ме за
guest
9 Коментара
стари
нови оценка
Отзиви
Всички коментари