allgemein
objekt-orientierter entwurf
programmierung
qualitätssicherung / testen

bugTeaser  #006: Selbstbetrug  
Schwierigkeitsgrad  mittel 
Lösung veröffentlicht am   14.05.05  

Erklärung

Das Erstaunliche an diesem bugTeaser ist wohl vorallem der Umstand, dass der durchschnittliche C++-Programmierer den Fehler leicht entdeckt, während sich selbst gestandene Delphi-Profis verwundert am Kopf kratzen und nichts Anrüchiges entdecken können. Denn der Fehler ist so offensichtlich wie einfach zu beheben und kann am besten mit folgendem xUnit4Delphi-Testfall illustriert werden:

procedure TAssignTests.TestSelfAssign;
var
  Items: TStrings;
const
  sLine1 = 'Line 1';
  sLine2 = 'Line 2';
  sLine3 = 'Line 3';
begin
  Items := TStringList.Create;
  try
    Items.Add(sLine1);
    Items.Add(sLine2);
    Items.Add(sLine3);
    Items.Assign(Items);
    AssertEquals('Wrong number of elements after
self assign',3,Items.Count); finally Items.Free; end; end;

Dieser Test wird schief gehen, da nach der Selbstzuweisung des StringList-Objekts dieses nicht die erwarteten drei Elemente enthält sondern leer ist. Der Grund dafür ist einfach: die Implementierung der Assign-Methode lässt die Möglichkeit der Selbstzuweisung schlicht ausser Acht und löscht unbesehen den Inhalt der Liste vor der Übernahme der Werte aus der neuen Liste. Was fehlt, ist eine Prüfung, ob es sich bei der übergebenen Liste das eigene Objekt handelt:

if Source = Self then Exit;


Über diesen bugTeaser diskutieren.

Druckbare Version