next up previous contents
Next: Zkrácené vyhodnocování logických výrazů Up: Ukazatele Previous: Ukazatele odkazují do nealokované   Obsah

Porovnávání ukazatelů, které ukazují do nealokované paměti

Toto je v podstatě stejný problém jako v minulém odstavci. Tato chyba je stejně závažná jako zákeřná. Její zákeřnost spočívá v tom, že se v reálném režimu často neprojeví ani při ladění. V protected módu takový program spolehlivě skončí s runtime error. Prohlédněte si následující příklad:

{Porovná dva seznamy.}
procedure compareLists(list1, list2 : Tlist)
var
  l1, l2 : Tlist;
  same : boolean;
begin
  same := false;
  l1 := list1;
  l2 := list2;
  while (l1^.next <> nil) and (l2^.next <> nil) and (same) do
  begin
    l1 := l1^.next;
    l2 := l2^.next;
    same := l1^.data = l2^.data;
  end;
  compareLists := (same) and (l1^.next = nil) and (l2^.next = nil);
end;

Zkušené oko už jistě vidí chyby, které tento kód obsahuje. Problém je v podmínce příkazu while. Pokud předáme proceduře prázdný seznam - ukazatel bude nil, stane se toto:

  (nil^.next <> nil)

Problém je, že v reálném režimu se to nemusí projevit. Dokonce se může zdát, že kód funguje. Ovšem obecně může takový odkaz obsahovat náhodnou hodnotu. Takto vznikají těžko odhalitelné chyby. V protected módu program při pokusu o něco takového skončí s runtime error. Podmínka v tomto příkladě by měla být takto:

  while (l1 <> nil) and (l2 <> nil) and (same) do



David Martinek 2002-10-01