Seite 1 von 1

PB3.94 u. PB4b11 Bug: PokeB und PokeS machen Fehler

Verfasst: 07.05.2006 20:39
von Torakas
Hi Leute,

bin gerade dabei die SNMP Library für PB4 umzuschreiben und hab dabei einen Fehler entdeckt der nicht sein sollte.

Hier mal der Code dazu

Code: Alles auswählen

*test = AllocateMemory(1024)

PokeS(*test + 0, "1", 1)
PokeS(*test + 1, "2", 1)
PokeS(*test + 2, "3", 1)
PokeS(*test + 3, "4", 1)
PokeS(*test + 4, "5", 1)

; Fehlerfreie Ausgabe
Debug PeekS(*test)

; Aendere zweite Stelle durch das selbe Zeichen
; sollte keine Aenderung geben
PokeS(*test + 1, "2", 1)

; Ausgabe was jetzt rauskommt
Debug PeekS(*test)

; Gib einfach mal den Ascii Wert aus um zu sehen was jetzt drinne ist
Debug ""
For i = 0 To 4
  Debug Asc(PeekS(*test + i, 1))
Next i
Wenn ich an der selben stelle ein Byte aendern will und sogar noch mit dem selben Zeichen dann sollte sich in der ausgabe nichts aendern, aber er fügt einfach nach der Stelle ein chr(0) ein und ueberschreibt damit den anderen Wert.

Desweitern hab ich bemerkt wenn man z.B. zuwenig speicher mit AllocateMemory reserviert kann man trotzdem beliebig viele Zeichen in den Speicher schreiben....

Kann mir vorstellen das es normal ist, auch in anderen Sprachen wie in C z.B., nur das der Programmierer selber aufpassen muss was er machen muss. Sonst kann es evtl zu einer Speicherverletzung kommen.

Aber der Bug oben sollte nicht sein... Bitte PRüfen und dann weiterleiten wenn es sich bestätigt. Kann sein das es in den anderen Pokebefehlen auch so ist und nicht nur bei PokeB und PokeS

Gruß,
Torakas

Verfasst: 07.05.2006 20:57
von jear
@Torakas
Aus der PB-Hilfe zu PokeS:
Für fortgeschrittene Programmierer. Schreibt einen String (einschließlich einer abschließenden '0') an die angegebene Speicheradresse.

Ein optionaler Parameter 'Laenge' (in Bytes) kann angegeben werden, welcher die Länge des Strings angibt, trotzdem wird nach dem geschriebenen ('poked') String noch eine Null angehängt (d.h. die Angabe von 6 wird 7 Bytes schreiben, 6 für den String, und das letzte Byte wird Null sein).
Das ist richtig und so gewollt. Wenn Du das vermeiden willst, dann nutze nicht PokeS sondern PokeB!

Einen Speicherschutz hat PB meines Wissens nicht implementiert. Da muss man als Programmierer selbst aufpassen. Geht das ganze über den der Task eingeräumten Speicherbereich hinaus, dann passt Windows auf.

Verfasst: 07.05.2006 22:28
von Torakas
Danke, hat geholfen.