PDA

View Full Version : CL-Variable



niki
23-05-04, 10:37
Hallo! Wer kennt sich aus?

Was passiert, wenn ich in eine CL-Variable, die mit einer Länge 30 deklariert wird, einen längeren String übergebe?

Danke :o

BenderD
23-05-04, 11:32
Hallo,

OS400 verwnedet Call by reference, d.h. die Variable ist im aufrufenden Programm mit Speicher hinterlegt und es wird ein Pointer auf den Speicher an das aufgerufene Programm übergeben.


Hallo! Wer kennt sich aus?

Was passiert, wenn ich in eine CL-Variable, die mit einer Länge 30 deklariert wird, einen längeren String übergebe?

Danke :o

In diesem Fall sind im aufgerufenen Programm die ersten 30 byte zugänglich, der Rest bleibt unverändert. Umgekehrt wird es kriminell, wenn man den Parameter im aufgerufenen Programm länger deklariert als im aufrufenden, wird lustig im Speicher des aufrufenden Programmes rumgemalt, damit können dann Variablen verdonnert werden, die nicht übergeben wurden, oder sogar Code-Segmente beschädigt werden.

mfg

Dieter Bender

Fuerchau
23-05-04, 18:50
@Dieter
Code kann nicht geschädigt werden, da er unter Speicherschutz steht, aber das Überschreiben von Datenbereichen ist sehr wahrscheinlich. Wenn nur Lesend zugegriffen wird ist das meist kein Problem. Viele Schnittstellen-Programme arbeiten so (API's) allerdings immer mit einer Längeninformation wieviel denn nun verwendet werden darf.
Bei falscher Längeninfo knallts dann auch meist, allerdings häufig an Stellen, die mit dem direkten Aufruf aber auch gar nichts mehr zu tun haben.

BenderD
23-05-04, 21:10
Hallo Baldur,

das mit dem Speicherschutz, das habe ich auch schon gelesen, alleine mir fehlt der Glaube. Wenn ich einen MCHK zurück bekomme, interpretiere ich das so, dass das OS feststellt: "eigentlich wollte ich diesen Speicher ja schützen"; ich bin nach wie vor der Meinung, dass die, die OS400 C2 gegeben haben volltrunken gewesen sein müssen.

Dieter Bender


@Dieter
Code kann nicht geschädigt werden, da er unter Speicherschutz steht, aber das Überschreiben von Datenbereichen ist sehr wahrscheinlich. Wenn nur Lesend zugegriffen wird ist das meist kein Problem. Viele Schnittstellen-Programme arbeiten so (API's) allerdings immer mit einer Längeninformation wieviel denn nun verwendet werden darf.
Bei falscher Längeninfo knallts dann auch meist, allerdings häufig an Stellen, die mit dem direkten Aufruf aber auch gar nichts mehr zu tun haben.

Fuerchau
24-05-04, 10:05
Was soll das OS denn anderes machen als einen MCH-Fehler: Speicherschutzverletzung zurückzumelden. Windoof gibt dann nur einen Blue-Screen !

BenderD
24-05-04, 11:50
Hallo Baldur,

wenn ich mich recht erinnere, bekomme ich den MCHK wenn ich im Call Stack nach oben komme und ich würde den eigentlich im aufgerufenen Programm bei dem Zugrif erwarten.


Was soll das OS denn anderes machen als einen MCH-Fehler: Speicherschutzverletzung zurückzumelden. Windoof gibt dann nur einen Blue-Screen !

Ehrlicherweise muss man natürlich dazusagen, dass bei Windows sich das ganze im Multithreaded Kontext abspielt und was OS400 macht, wennn ich aus einem unter WebsFear laufenden Java Programm ein CL aufrufe, das solchen Unfug treibt ... und außerdem erwarte ich von OS400 ein wenig mehr als von Windows.

mfg

Dieter Bender

Fuerchau
24-05-04, 13:23
Dies liegt im Einspeicher-Konzept begründet.
Durch die Art der Pointer-Definition (SPCPTR, SYSPTR) kann ich sowieso nur auf Variablen zugreifen, die per Basis SPCPTR definiert sind.
Ich kann auch seit V4 keine Pointerart mehr ändern was nun auch zu einem MCH-Fehler führt, sondern ich muss gezielt die Pointer-Befehle verwenden.
Wenn ich nun mal eine Variable "based(xyz)" deklariere bin ich selber für die korrekte Verarbeitung verantwortlich (war übrigens schon immer so).

Erst mit Windows-COM gibt es sowas eher selten, da es keinen Call by Reference mehr gibt, sondern alle Variablen über Kopien ausgetauscht werden. Wenn ich da allerdings auch drüber weggehe kommt es irgendwann und selten sofort zu abstürzen.

Bei Java ist das dann eher wie bei Basic. Ich habe z.B. den Variablentyp String, dessen Inhalt bei jeder Veränderung eine neue Adresse bekommt. Die Variable String selber enthält nur einen Verweis auf den aktuellen Speicher und ich kann String nur mit den zugelassenen Methoden verändern.
Rufe ich allerdings eine DLL auf kann das schon wieder platzen.

Das gleiche gilt auch für Array's, Variant usw.