Nicht definitionskonforme Implementierung des step-until-elements der Laufanweisung. Die implementierung entspricht weder den Vorgabendes Revised Report noch jenen des Modified Report.
Für in Verteilern aufgeführte Marken werden zu strenge Sichtbarkeitsregeln implementiert, die zulässige Sprünge in compound statements verhindern.
Bei Verteilern wurde ein Problem bemerkt, wenn der Index des Verteilers ein durch Namensaufruf übergebener formaler Parameter ist.
begin comment * When compiled with the MARST Algol-to-C Translator, Version 2.7, * this program terminates with a memory access error when the * switch index is computed in procedure execSwitch. ; procedure execSwitch(idx); integer idx; begin switch sw := label1, label2; goto sw[idx]; comment ERROR OCCURS HERE ; label1: outstring(1, "Case 1\n"); goto exit proc; label2: outstring(1, "Case 2\n"); exit proc: end execSwitch; execSwitch(1); execSwitch(2) end
Bei der Ausführung der Anweisung
goto sw[idx];
tritt ein Speicherzugriffsfehler auf.
Die folgende Variante des Programms funktioniert:
begin procedure execSwitch(idx); integer idx; begin switch sw := label1, label2; integer d; d := idx; goto sw[d]; label1: outstring(1, "Case 1\n"); goto exit proc; label2: outstring(1, "Case 2\n"); exit proc: end execSwitch; execSwitch(1); execSwitch(2) end
Der gleiche Fehler kann auch mit einem ähnlichen Beispielprogramm demonstriert werden, in dem der Index des Verteilers durch eine als Parameter bereitgestellte Funktionsprozedur berechnet wird:
begin comment * When compiled with the MARST Algol-to-C Translator, Version 2.7, * this program terminates with a memory access error when the * switch index is computed in procedure execSwitch. ; procedure execSwitch(idx); integer procedure idx; begin switch sw := label1, label2; goto sw[idx]; comment ERROR OCCURS HERE ; label1: outstring(1, "Case 1\n"); goto exit proc; label2: outstring(1, "Case 2\n"); exit proc: end execSwitch; integer procedure idx1; idx1 := 1; integer procedure idx2; idx2 := 2; execSwitch(idx1); execSwitch(idx2) end
Auch hier kann durch Zwichenspeicherung des Indexwerts eine funktionsfähige Version hergestellt werden:
begin procedure execSwitch(idx); integer procedure idx; begin switch sw := label1, label2; integer d; d := idx; goto sw[d]; label1: outstring(1, "Case 1\n"); goto exit proc; label2: outstring(1, "Case 2\n"); exit proc: end execSwitch; integer procedure idx1; idx1 := 1; integer procedure idx2; idx2 := 2; execSwitch(idx1); execSwitch(idx2) end
Fehleranalyse
Die Compilierung des Switch geschieht in der Prozedur switch_designator in marst.c. Diese Prozedur beginnt in Zeile 1534. In den Zeilen 1579 bis 1582 wird der Fall des lokal vereinbarten Verteilers behandelt. Dort fehlt wohl die Behandlung des Falls, dass der Indexausdruck ein call-by-name-Parameter ist. In Zeile 2505 in Prozedur primary steht die Compilierung eines mit call-by-nme bereitgestellten Integerwerts.