|
OpenAccess IV String handling bug
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
Mich ereilte kürzlich ein weiterer Bugreport zu OpenAccess IV: Problembeschreibung Versucht man, in einem OA4 Programm eine dynamische View mithilfe von mehreren Variablen zu erstellen, so hängt sich das kompilierte Programm unter bestimmten Bedingungen in einer Endlosschleife auf: 1. Es müssen mehrere variablen miteinander verkettet werden (zumindest 2) 2. Am Ende der Bedingung muss ein Anführungszeichen gefolgt von einer beliebigen Anzahl von Zeichen stehen (also kein direktes Ende des Strings) Code:
STR v1=""Ursache Die Suche nach diesem Fehler gestaltet sich sehr schwierig. OA4 bleibt nämlich im virtuellen P-Code hängen, über den ich ja schonmal in diesem Thread erzählt habe. Kurz gesagt sind das virtuelle opcodes, welche eine bestimmte Bedeutung haben und dann von der PCode-Runtime, auf der OpenAccess basiert, ausgeführt werden. Bislang hatte ich ja keinerlei Informationen zu diesen Opcodes, aber durch intensive Internet-Recherche habe ich tatsächlich eine Doku zum von OA verwendeten SofTech P-System gefunden! 1-140.41.A_pSysInternArc_83.pdf Durch ein break in einem Debugger konnte ich zumindest im Assemblercode einmal die Opcodes lesen, welche ausgeführt werden und habe dadurch dann die Stelle in der RT.LIB mit dem P-Code indentifiziert, welcher dort immer in einer Endlosschleife geloopt ist. Zu beachten ist, dass der Code ursprünglich in der RT.LIB liegt, aber beim Einbinden von Programmen auch in die APP.SPI kopiert wird. Dh. die RT.LIB ist in jedem Fall zu patchen und die APP.SPI, falls sich dort der Code drinnen befindet (also beim Patcher nicht wundern, wenn er die APP.SPI nicht patcht). Zur weiteren Analyse habe ich mir dann einen eigenen Disassembler geschrieben, welcher die binären Opcodes in lesbaren "P-Code Assemblercode" wandelt. Ausgestattet damit habe ich anschließend den P-Code disasembliert und die Stelle aufgezeichnet, wo die Endlosschleife auftritt. In den Kommentaren stehen die Werte, die zum Zeitpunkt der Ausführung im Speicher waren (konnte ich wiederum über den debugger lesen). Um den Code zu verstehen empfiehlt sich die Lektüre des oben erwähten Handbuchs: Code:
00000000 87 80 89 LDL 137 ; 0x04In unserem Fall also nicht. Der lokale Wert 138, der anschließend geprüft wird, scheint ein Boolean-Wert zu sein, der besagt, ob der nächste String gelesen werden soll oder nicht. Bei uns ist er 0, also springt er weiter auf Adresse 35, wo der aktuelle String verarbeitet wird. Der aktuelle String hatte eine Länge von 214 (=0xD6 hex) Bytes. Die Länge wird in Arbeitsregister 6 gespeichert. Der aktuelle Zeiger für das zu verarbeitende Zeichen (in Arbeitsregister 2) ist jedoch schon hinter der Stringlänge, nämlich auf 215 (=0xD7 hex). Es folgen 2 Prüfungen auf einfache und doppelte Anführungszeichen, die beide nicht erfüllt werden können, da man sich ja schon hinter der Stringlänge befindet. Wenn der aktuelle Stringzeiger eben größer der Stringlänge ist, dann wird auf Adresse 549 gesprungen, welche wiederum an den Anfang der Routine zurückspringt und so loopt OA4 fröhlich in einer Endlosschleife vor sich hin. Bei genauerer Betrachtung der Routine findet man an Adresse 531, welche auch an Adresse 109 referenziert wird, dieselbe Prüfung, die jedoch bei Überschreiten der maximalen Stringlänge den Boolean-Wert in 138 auf 1 setzt und erst dann zurückspringt. Wenn der Wert 1 am Anfang ist, wird der nächste String gelesen, also eigentlich genau das, was man in diesem Fall möchte. Daraus ergibt sich ein denkbar einfacher Patch: Man ändert der Sprung an Adresse 75 vom Ziel 549, welches ja direkt wieder loopt, auf 545, wo dann auch korrekterweise der BOOL-Wert gesetzt wird, um zum nächsten String zu springen. Ergibt also einfach eine Änderung der des Hex-Werts D7 an Offset 75 in D3 und der Fehler ist behoben :) Wuerde man den Assemblercode als C-Pseudocode schreiben, so kann man das Problem einfacher nachvollziehen: Code:
// strings == Apex-String mit pString[0] = StringlaengeEinen praktischen kleinen Patcher für den Hausgebrauch gibts wie immer im Anhang. Lg. und gute Nacht ;) |
|
Funktioniert perfekt - vielen Dank!
Gruß Hans Jürgen |
|
Für alle die sich NICHT registrieren wollen, gibt es den Patcher natürlich wie immer auch auf der Download Seite: http://www.waldbauer.com/tmp/reference.php
|
| Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr. |
Powered by vBulletin® Version 3.8.7 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.