Das Beispiel-Projekt

Wie in der Einleitung beschrieben, wollen wir einen kleinen Stack implementieren und testen.

Stack-Header

Hier nochmals der Header:

class Stack
{
  unsigned int * Buffer;
  unsigned int   Size;
  unsigned int   Position; 
 
  public:
    Stack( unsigned int size );
    ~Stack();
 
    bool Push( unsigned int   value );
    bool Pop ( unsigned int & value );
 
    inline unsigned int * GetBuffer() { return Buffer; }
    inline unsigned int   GetSize()   { return Size; }
    inline unsigned int   GetUsed()   { return Position; }  
};

Stack-Implementierung

Und hier die Implementierung, die noch nicht ganz richtig funktioniert:

#include "stack.h"
 
Stack::Stack( unsigned int size )
  : Size( size )
  , Position( 0 )
{
  Buffer = new unsigned int [ size ];
}
 
Stack::~Stack()
{
  delete [] Buffer;
}
 
bool Stack::Push( unsigned int   value )
{
  if( Position > Size )
    return false;
 
  Buffer[ Position ] = value;
  Position ++;
 
  return true;
}
 
bool Stack::Pop ( unsigned int & value )
{
  Position--;
  value = Buffer[ Position ];
  return true;
}

Der aktuelle Stand der Implementation

Wird das Programm ausgeführt, Werden die Werte 1, 2 und 3 auf den Stack gelegt und wieder anschließend solange abgerufen, bis keine Werte mehr kommen. Leider funktioniert das Programm nicht richtig. Das Programm wird unter Linux abgebrochen:

# ./program 
Wert: 3
Wert: 2
Wert: 1
Speicherzugriffsfehler

Wir müssen also erkennen, dass unsere Implementation korrigiert wird und ein Test soll dafür sorgen, dass dieser Fehler nie wieder auftaucht.

Der Speicherzugriffsfehler muss nicht sofort passieren! Auf einem Mac ergab sich beispielsweise folgende Ausgabe mit vollkommen willkürlichen Werten nach 3, 2, 1:

Neo:stack_full xin$ ./program 
Wert: 3
Wert: 2
Wert: 1
Wert: 0
Wert: 0
Wert: 0
.... etwa 80 Zeilen gekürzt ....
Wert: 0
Wert: 0
Wert: 0
Wert: 4096
Wert: 40
Wert: 0
Wert: 0
Wert: 0
Wert: 101
Wert: 1852791395
Wert: 1869376609
Wert: 1299475573
Wert: 1634100548
Segmentation fault

Download

Das Projekt ist in der fehlerhaften Form, wie hier beschrieben als ZIP-Archiv mit Makefile zum Download bereit.