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.

delphi
{$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.

#delphi #debugowanie