Stimmt, habe ich übersehen.
Auch bzgl. des Returnwertes solltest du ggf. keinen Pointer (%ADDR) zurückgeben sondern direkt ein Zeichenfeld, ggf. auch mit VARYING.
Auch weiß ich nicht, was dir "%str(%addr(getlabz))" liefern soll.
"getlabz" muss ein Pointer sein da deine Prozedur einen zurückgibt.
%addr liefert dir nun die Adresse des Pointers im Speicher.
%str versucht nun davon einen Nul-terminerten String zu laden.
Korrekt wäre da eher "%str(test(p12))", wenn der Return deiner Funktion auch einen C-String liefert.

Besser und übersichtlicher sind allemal native RPGLE-Variablen. Pointer sind eher was für API's.