+-------------------------+
| "things to do for p3"   |
+-------------------------+


- Compiler - Abstruz (Signal 11)
  bei fehlendem BEGIN im Hauptprogramm (bug_begin.pm)

- Fehler bei dyn. Speicherallokation
MODULE bug_dyn;
CONST x=10;
 
   PROCEDURE par(m: INTEGER);
   TYPE dir=ARRAY[1..m] OF REAL;
   VAR  i   :CARDINAL;
        P   :dir;
   BEGIN
     FOR i:=1 TO m DO WriteInt(i,3);P[i] :=0.0; END;  (* ENDLOSSCHLEIFE!!*)
   END par;
 
BEGIN
  par(x);
END bug_dyn.


- Fehler bei dyn. Speicherverw. mit Pointer
MODULE bug_pointer;
  TYPE PointerType= POINTER TO DataNode;
       DataNode   = RECORD;
                     Numer:REAL;
                     Point:PointerType;
                    END;
   CONFIGURATION linie [1..10];
   VAR AP:linie OF PointerType;
 
BEGIN 
  NEW(AP);
  AP^.Numer:=0.0;  (* steigt hier aus, siehe Debugger-Meldung unten *)
  AP^.Point:=NIL;
END bug_pointer.
----------------------
Debugger:
 (xp3gdb) print AP
 $1 = CONFIGURATION linie {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
 (xp3gdb) (xp3gdb) next
 Program received signal SIGSEGV, Segmentation fault.

####### Das Problem besteht sogar im rein seq. Fall !!! #######
MODULE bug_pointer;
  TYPE PointerType= POINTER TO DataNode;
       DataNode   = RECORD;
                     Numer:REAL;
                     Point:PointerType;
                    END;
   VAR AP: PointerType;
 
BEGIN 
  NEW(AP);
  AP^.Numer:=0.0;
  AP^.Point:=NIL;
END bug_pointer.



- beim IF fehlt der Type-Check
---
MODULE bug_if;
BEGIN
  IF 1.23 THEN Write('j') ELSE Write('n') END;
END bug_if.


- ich moechte einen Proz.-Parameter uebergeben, dessen Argument eine
  offene Config. ist:
-------
MODULE bug_proc;
CONFIGURATION weights[*];
CONFIGURATION my_w = weights[1..5];
VAR x: my_w OF REAL;
 
TYPE patproc = PROCEDURE (VAR weights OF REAL);
 
PROCEDURE p1(p: patproc; VAR a: weights OF REAL);
BEGIN
  p(a);
  WriteFixPt(a,10,2);
END p1;
 
PROCEDURE pat(VAR u: weights OF REAL);
BEGIN
  u := 0.0;
END pat;
 
BEGIN
  p1(pat,x);
END bug_proc.
----------
matisse:[bugs] >p3 bug_proc
bug_proc.c: In function `p1':
bug_proc.c:21: too many arguments to function
bug_proc.c: In function `main':
bug_proc.c:65: warning: passing arg 1 of `p1' from incompatible pointer type



- Range Check
ich dachte der Range-Check ging schon mal ??
------
MODULE bug_range2;
VAR a: ARRAY[1..8] OF INTEGER;
    i: INTEGER;
BEGIN
  i := a[0];
  WriteInt(i,5); WriteLn;
END bug_range2.
------
matisse:[bugs] >a.out
    0
<<keine Fehlermeldung>>


- LOWER / UPPER in Connections
MODULE bug_lower;
CONFIGURATION weights[*],[*];
CONNECTION f: weights[i,1]  -> weights[i,*];                (* OK *)
           g: weights[i,j]  -> weights[LOWER(weights,1),*]; (* OK *)
           h: weights[i,LOWER(weights,1)]  -> weights[i,*]; (* bug *)
END bug_lower.
----------
matisse:[bugs] >p3 bug_lower
bug_lower.pm line    5, 30: Error       syntax error
bug_lower.pm line    5, 30: Information expected tokens: , ] 
bug_lower.pm line    5, 31: Information restart point
bug_lower.pm line    5, 31: Repair      token inserted: ,
bug_lower.pm line    5, 40: Error       syntax error
bug_lower.pm line    5, 40: Information expected tokens: , ] 
bug_lower.pm line    5, 41: Information restart point


- Umbenennung von Bezeichnern
Bezeichner, die auch in C vorkommen, verursachen Probleme,
alle Parallaxis-Bezeichner sollten umbenannt werden z.B. p3_xxx


- Problem mit offenen Konfigs.
MODULE bug_open;
CONFIGURATION input [*];  (* 1..n+1 neurons with "on" neuron in last pos *)
CONFIGURATION hidden[*];  (* 1..m+1 neurons with "on" neuron in last pos *)
 
PROCEDURE NetStep (inval: input OF REAL; h: hidden OF REAL);
END NetStep;
 
PROCEDURE BackProp(inval: input OF REAL; hidval: hidden OF REAL);
BEGIN
  NetStep(inval,hidval);
END BackProp;
 
BEGIN
END bug_open.
-----
bug_open.pm line   10,  3: Error       incompatible configurations in generic configuration parameters: NetStep
 
1 semantic error occured !



- Fehlende Fehlermeldung
MODULE bug_type2;
CONFIGURATION input[1..10];
VAR x: input;
BEGIN
END bug_type2.
----
Compiler process received signal 11
p3: Error! Compiler exited abnormally.



- Fehlende Fehlermeldung bei VAR-Param.
---------------
MODULE bug_vparam;
PROCEDURE a (VAR x: INTEGER);
END a;
 
BEGIN
 a(7);
END bug_vparam.
--------------
matisse:[bugs] >p3 bug_vparam.pm 
bug_vparam.c: In function `main':
bug_vparam.c:29: invalid lvalue in unary `&'


- Arithmetik-Fehler auf SGI
MODULE bug_root;
CONST G = 4.0 ** 0.5;
BEGIN
  WriteReal(G, 10); WriteLn;
  WriteReal(4.0 ** 0.5, 10);
  WriteLn;
END bug_root.
 
Ausfuehrung auf Sun:
matisse:[bugs] >a.out
2.0000e+00
2.0000e+00
 
Ausfuehrung auf SGI:
munch:[bugs] >a.out
1.9972e-81
2.0000e+00


- hier fehlt noch eine p3c - Fehlermeldung:
MODULE bug_tree;
CONFIGURATION tree[1..15];
CONNECTION child: tree[i] -> tree[2*i];
BEGIN
  child := 3;
END bug_tree.
--------
matisse:[bugs] >p3 bug_tree
bug_tree.c: In function `main':
bug_tree.c:32: incompatible types in assignment


- Fehler bei String-Operation
MODULE bug_string;
VAR a: ARRAY[1..2] OF CHAR;
BEGIN
  ReadString(a);
  WriteString(a);
END bug_string.

bei Eingabe von zu langen Strings wird der nachfol. Speicherplatz ueberschrieben
Gerade das sollte nicht passieren, sondern die Array-Laenge (-1 wegen CHR(0) )
als Max. Anzahl der zu lesenden Zeichen verwendet werden.



- Fehler bei Typpruefung bei OR
MODULE bug_or;
CONFIGURATION grid[1..5],[1..5];
VAR x: grid OF INTEGER;    
BEGIN                  
 IF 1 < x OR x > 4 THEN               
   Write("X")   
 END       
END bug_or.
 
matisse:[bugs] >p3 bug_or
bug_or.c: In function `BEGIN_MODULE':
bug_or.c:20: `H_10' undeclared (first use this function)
bug_or.c:20: (Each undeclared identifier is reported only once
bug_or.c:20: for each function it appears in.)
bug_or.c:21: parse error before `H_11'
bug_or.c:22: `H_13' undeclared (first use this function)
bug_or.c:23: `H_14' undeclared (first use this function)
bug_or.c:34: `H_11' undeclared (first use this function)
------------------------
Bei skalarem "x", d.h. "VAR x: INTEGER" meldet p3 korrekt den Fehler!



- fehlende Var - Bez.(bei Namensgleichheit mit freier CONN - Var.)
  als Fehler melden
MODULE bug_con;
CONFIGURATION list[1..5];
CONNECTION next: list[i] -> list[i+1];
 
BEGIN
  i := 1;  (* <-- hier sollte Fehlermeldung kommen !!! *)
END bug_con.

Statt Fehlermdeldung von Parallaxis kommt hier der C-Compiler:
matisse:[bugs] >p3 bug_con
bug_con.c: In function `BEGIN_MODULE':
bug_con.c:24: `i' undeclared (first use this function)
bug_con.c:24: (Each undeclared identifier is reported only once
bug_con.c:24: for each function it appears in.)



- Range Checks werden noch nicht durchgefuehrt.
  Range Check sollte per default "an" sein und mit "-r" ausgeschaltet werden
  (gilt auch fuer Parameter-Bez. in "p3")


- bei in PE-No. range checks: Falls Fehler im Zugriff gefunden
  werden, so wird die falsche Zeilennummer (naemlich aus C-Prog.
  und NICHT aus P3-Prog. gemeldet)


- bei Deklaration von Daten fuer eine offene Konfiguration muss eine
  Fehlermeldung kommen (sonst Probleme beim C-Compiler)
MODULE testtrans;
FROM ImageIO IMPORT gray,read_g_image, write_g_image;
IMPORT Hist;
CONST size = 3;
CONFIGURATION image = Hist.grid[1..size],[1..size];
TYPE
   g_image   = Hist.grid OF gray;
   hist      = ARRAY[0..255] OF INTEGER;
 VAR
  gpict : g_image;
BEGIN
  gpict := ID(Hist.grid);
  WriteInt( gpict, 3 );
END testtrans.


- ID(xx), DIM(xx,y) mit "xx" offene Konfiguration muss eine Fehlermeldung 
  bringen, sonst Probleme bei C-Compiler


- Fehlende Typpruefung bei Record-Konstanten
  TYPE com = RECORD re,im: REAL END;
  CONST i  = com(0,1);
  ^^^ keine Fehlermeldung (sollte aber)


- Uebersetzen von /home/braunl/examples/ray liefert:
matisse:[ray] >p3 ray
ray.c: In function `initrays':
ray.c:680: request for member `d' in something not a structure or union
ray.c:751: request for member `d' in something not a structure or union
ray.c:757: request for member `d' in something not a structure or union
ray.c: In function `shade':
ray.c:1860: request for member `d' in something not a structure or union
ray.c:1902: request for member `d' in something not a structure or union
ray.c:1925: request for member `d' in something not a structure or union
ray.c:2033: request for member `d' in something not a structure or union
ray.c:2056: request for member `d' in something not a structure or union


- manche Programme mit grossen offenen Konfigurationen terminieren nicht!
  z.B.: ~braunl/b3prog/dither.pm
  Evtl. Problem mit Freigabe-Routinen:
  FREE_CONFIGURATION(&image, TRUE);
  FREE_GENERIC_CONNECTION("Local_right", &image);
  FREE_GENERIC_CONNECTION("Local_left", &image);
  FREE_GENERIC_CONNECTION("Local_up", &image);
  FREE_GENERIC_CONNECTION("Local_down", &image);
  FREE_GENERIC_CONNECTION("Local_up_l", &image);
  FREE_GENERIC_CONNECTION("Local_down_r", &image);
  FREE_GENERIC_CONNECTION("Local_up_r", &image);
  FREE_GENERIC_CONNECTION("Local_down_l", &image);
  EXIT_MODULE();
}

 

- DIM(config_name, x)
  mit x > RANK(config_name) muss eine Fehlermeldung zur Laufzeit bringen!


- Werden CONSTante als aktuelle Parameter fuer Referenzparameter uebergeben,
  so gibt p3c keine Fehlermeldung, aber beim C-Compiler gibt es Pobleme.
  Der Compiler sollte dies finden !!
MODULE bug_const;
  PROCEDURE vv(VAR x: INTEGER);
  BEGIN
    x:=1;
  END vv;
BEGIN
  vv(2);
END bug_const.
---------
bug_const.c: In function `main':
bug_const.c:30: invalid lvalue in unary `&'



- Die Uebereinstimmung der Def. in mod.pd und mod.pm werden
  nicht korrekt geprueft !!


========================================================
p3- Verbesserungen
------------------

- p3 mymod.    (mit Punkt am Ende)
  sollte mymod.pm und mymod.pd finden


- p3 -r ...
  Heisst Range-Check ABGESCHALTET


- p3 mymod
  Falls .pd und .pm existieren, sollte die Option "-c" automatisch
  generiert werden, die Linker Warnungen sollten NICHT erscheinen.
  Library-Meldungen elim.
gcc: -lp3: linker input file unused since linking not done
gcc: -lm: linker input file unused since linking not done

