Speicherverletzungen erkennen

Luna ermöglicht die dynamische Verwendung von Speicherobjekten im Arbeitsspeicher. Zu den Speicherobjekten im Arbeitsspeicher zählen Strings und MemoryBlocks.

Siehe hierzu: Speicherverwaltung

Um zu erkennen, ob Daten der aktiven Speicherobjekte nicht beschädigt sind, ist in Luna eine entsprechende Überwachungsfunktionalität über Exceptions implementiert. Mittels dieser Überwachung können Fehler wie Speicherüberläufe, Zugriffe über Objektgrenzen hinaus und Speichermangel erkannt werden.

Siehe hierzu: Exceptions

Mittels der Exceptions OutOfBoundsMemory und NilObjectException werden Zugriffe über Speichergrenzen oder nicht erzeugte Speicherobjekte erkannt.

Beispiel

Wir erzeugen einen MemoryBlock und schreiben Daten hinein. Wird nun durch einen Programmierfehler versucht außerhalb des MemoryBlocks Daten in den Speicher zu schreiben, löst dies die Exception OutOfBoundsMemory aus. Da ohne Implementierung der Exceptions die Überwachungsfunktionen aus Performancegründen entfallen, kann dies zum Beschädigen der internen Speicherstruktur und damit zu sich kaskadierenden schweren Programmfehlern führen. Die Exception ermöglicht hier das Finden solcher Speicherverletzungen.

const F_CPU=20000000
avr.device = atmega328p
avr.clock  = F_CPU
avr.stack = 32
 
uart.baud = 19200
uart.recv.enable
uart.send.enable
 
dim i as byte
dim m as MemoryBlock
 
print 12;"out of bounds exception example"
print
 
'Speicherblock allozieren mit 16 Bytes Speicherplatz
m.new(16)
 
'prüfen ob der Speicherblock alloziert werden konnte
if m<>nil then
  'Schreiben in den Speicher über eine Schleife. Außerhalb der 
  'Speicherkapazität des allozierten MemoryBlocks wird die
  'Exception ausgelöst.
  for i=0 to 20
    print "schreibe byte ";str(i);
    m.ByteValue(i)=i
    print " - ok"
  next
else
  print "Fehler: Speicherblock konnte nicht alloziert werden"
end if
 
do
loop
 
Exception OutOfBoundsMemory
  ' Fehlermeldung ausgeben
  Print "*** Exception OutOfBoundsMemory ***"
EndException