Cały dzień szukania, kto mi zmienia dane
Utworzono: 14 marca 2002 Zaktualizowano: 1 października 2026
Dziś cały dzień szukałem, kto mi zmienia wartość zmiennej, a w kodzie nie było ani jednego miejsca, które by to robiło.
Piszę w Delphi narzędzia do doboru i obróbki prób. Rano jedna ze zmiennych zaczęła mieć wartości, które nie miały prawa się pojawić. Sprawdziłem każde przypisanie, każde miejsce, gdzie jest przekazywana dalej, i nic, według kodu nikt jej nie rusza.
Skończyło się na przechodzeniu debuggerem linijka po linijce i pilnowaniu tej jednej zmiennej. Pod wieczór złapałem moment, w którym się zmienia, tylko że wykonywana linijka w ogóle jej nie dotyczyła, zapisywała coś do zupełnie innej tablicy.
Okazało się, że w projekcie była wyłączona kontrola zakresów i jedna tablica była zapisywana o jeden element za daleko. Delphi tego nie sprawdza, więc zapis szedł po prostu do pamięci za tablicą, a tam akurat leżała moja zmienna.
{$R-} // kontrola zakresów wyłączona var Counts: array[1..10] of Integer; Total: Integer; I: Integer; begin Total := 42; for I := 1 to 11 do // o jeden za daleko, Counts[11] nie istnieje Counts[I] := 0; // Total == 0 ?! end;
Poprawka to jedna liczba, znalezienie jej zajęło cały dzień.
Na przyszłość w wersji do testów włączam kontrolę zakresów i przepełnień ({$R+} i {$Q+}). Program chodzi trochę wolniej, ale taki błąd wywali się od razu tam, gdzie powstaje, a nie gdzieś dalej. A jak wartość znowu zacznie się zmieniać sama, to od razu stawiam pułapkę na zmianę tego miejsca w pamięci, zamiast szukać po kodzie.
Aktualizacja 2026
W Pythonie czy Go zapis poza tablicą od razu kończy się błędem, więc akurat ten rodzaj problemu zniknął. Ale nawyk z tamtego dnia został: nie ufać założeniu, że dane zmieniają się tylko tam, gdzie widać to w kodzie.