Trīs rindas, kas rēķināja nepareizi: kļūda kompilatorā
Mēs uzrakstījām programmu C++ valodā, un tā strādāja nepareizi. Tā nekrita un neuzkārās — vienkārši deva matemātiski nepareizu rezultātu.
Es pasaucu kolēģus, un mēs sākām rakties. Pārbaudījām visu rindu pa rindai — katra rinda bija pareiza, bet rezultāts joprojām nepareizs.
Tad sākām vienkāršot. Izņēmām klasi — joprojām nepareizi. Izņēmām liekos failus — joprojām nepareizi. Izmetām visu, kas nebija vajadzīgs, un katru reizi rezultāts palika nepareizs. Beigās programma saruka burtiski līdz trim četrām rindām. Un pat tās rēķināja nepareizi.
Pirmkodā vairs nebija ko skatīties, tāpēc mēs to disasemblējām un lasījām asambleru. Un ieraudzījām: tieši šajā vietā kompilators bija sajaucis reģistrus — ierakstīja vērtību vienā reģistrā, bet nolasīja no cita. Kļūda bija nevis mūsu kodā, bet Microsoft Visual C++.
Mēs nosūtījām kļūdas ziņojumu Microsoft.
Ko es no tā paņēmu: ja viss ir pārbaudīts un rezultāts tik un tā nesakrīt, apcērp programmu līdz mazākajam piemēram, kas vēl lūzt. Parasti pa ceļam atrodas paša kļūda. Bet, ja palikušas trīs rindas un programma joprojām melo, ir laiks paskatīties vienu līmeni zemāk — asamblerā. Tikai tad var noticēt, ka vainīgs ir kompilators.