Seite 1 von 2
PB 3.3, Space, Strings, AllocateMemory...
Verfasst: 29.12.2006 18:27
von DarkDragon
Hallo,
Ich versuche verzweifelt STARGATE zu erklären, warum das Poken in vor allem vorher nicht alloziierten Strings gefährlich ist. Doch er will es mir nicht glauben. Er meint, das Beispiel, welches er mir geschickt hat sei nur lauffähig wegen PB 3.3:
Code: Alles auswählen
String$ = ""
Procedure WriteStringLong(String, Position, Long)
PokeL(String+4*Position, Long)
EndProcedure
Procedure ReadStringLong(String, Position)
ProcedureReturn PeekL(String+Position*4)
EndProcedure
WriteStringLong(@String$,0,12)
WriteStringLong(@String$,1,24)
WriteStringLong(@String$,2,36)
WriteStringLong(@String$,5,48)
Debug ReadStringLong(@String$,0)
Debug ReadStringLong(@String$,1)
Debug ReadStringLong(@String$,2)
Debug ReadStringLong(@String$,5)
Ich glaube eher, dass es Zufall ist dass es bei ihm läuft wenn er es mit PB 3.3 startet. Er schreibt ja in unzugewiesenen Speicher wenn er vorher nicht wenigstens mit String$ = Space(20) den String-Speicherplatz reserviert. Er wills mir einfach nicht glauben.
Vielleicht kann einer von euch ihn dazu überzeugen. Bitte helft mir, ich hab keine Zeit mehr mit ihm darüber zu quatschen!!

Hab wichtigeres zu tun.
Verfasst: 29.12.2006 18:29
von STARGÅTE
Mir wäre auch geholfen damit ich mal ne andere meinung höre
Aber ich meine immer noch das meins das gelcihe ist als wenn ich das mache
Code: Alles auswählen
String$ = ""
...
String$ = String$+" 1"
String$ = String$+" 2"
...
Nummer1 = Val(Trim(Mid(String$, 1, 4)))
Nummer2 = Val(Trim(Mid(String$, 5, 4)))
...
Debug Nummer1
Debug Nummer2
Nur das das eine völlig andere Variante ist.
OK es hat sich geklärt
Ich habe eingesehen das man vorher die String$ erweiter muss damit er zusammenhängend in PB existiert.
Verfasst: 29.12.2006 21:45
von DarkSoul
Ein String nimmt soviel speicherplatz, wie er lang ist (+1, nämlich die nullterminierung).
Das heißt, ein String 'TEST' wäre 5 bytes lang. Der String NULL ist ein Byte. Im Speicher kann das mit dem mit 'TEST' gefüllten String so aussehen:
245865156.oiTEST,vbv18718981798-Nächstes Programm-
Die Zeichen davor und hinter sind andere Variablen. Da du mit POKE übers Ende wegschreibst, bleibst du immer noch in den Schanken des Speichers, das deinem Programm zueornet ist. Schreibst du jedoch zuweit nach rechts hin, triffst du irgendwann evtl. auf andere Programme, so dass du diese störst. und das stürzt natürlich ab! Wenn du die Stringvariable am Anfang hast (PB reserviert glaub ich immer ein bisschen Speicher, damit das Arrangieren einfacher wird, wenn die strings länger werden), hast du glück, dass du in dem 'vorreservierten' speicher schreibst und es glatt geht (bis die nächste variable ins leben gerufen wird). quetscht der string sich aber zwischen deinem programm und dem nächsten und du verlängerst bockbeinig deinen string auf diese art, ohne PB mit SPACE vorzuwarnen, schlägt er in fremden speicher. Du kannst auch pech haben, dass andere Programme plötzlich deinen Piraten-string abschneiden, weil sie nicht wissen können, dass du ihn da liegen hast, weil er nirgends gemeldet ist.
Das ist etwa so, als würdest du in einem gemeinsam genutzten Abstellraum den Platz von Mitbenutzern nutzen. Wenn sie ihn nicht brauchen, störts niemanden. wird er aber gebraucht, werden sie sauer, so von wegen 'wie kommst du dazu, meinen platz zuzumüllen!'. Nicht anders ist es im arbeitsspeicher.
Verfasst: 29.12.2006 22:07
von ZeHa
Rein theoretisch könnte es auch am Betriebssystem liegen, also daß z.B. das eine den Speicher anders verwaltet als das andere, und daß beim einen halt ungültige Bereiche überschrieben werden und beim anderen nicht. Kenn mich da aber zu schlecht aus, trotzdem wäre es wohl gut wenn DD und SG mal kurz drüber berichten könnten, unter welchem OS sie arbeiten...
Verfasst: 29.12.2006 22:10
von Spirit
Biedermeier hat geschrieben:Schreibst du jedoch zuweit nach rechts hin, triffst du irgendwann evtl. auf andere Programme, so dass du diese störst.
Soweit ich weiß kann man gar nicht in den Speicher anderer Programme schreiben. Da kommt doch dann diese Fehlermeldung mit dem 'Invalid Memory Access'.
Verfasst: 29.12.2006 22:13
von DarkSoul
eben! und darum kommts "unvorhersehbar" zum crash, aber man kann es zumindest versuchen

(a la 'PokeS(Random(457564),"Störenfried!")'

Nee! sollte man nie machen!!! Besonders, wenn man hardwaretreiber trifft, kann das auch richtig in die hose gehen!!!
Verfasst: 29.12.2006 22:25
von Spirit
Offenbar hast du mich nicht richtig verstanden. Ich meinte 'nicht können' im
Sinne von 'es geht nicht'. Jedes Programm bekommt vom Betriebssystem
einen privaten Heap zugewiesen, in dem es lesen und schreiben kann. Es
ist jedoch, soweit ich weiß, nicht möglich in den privaten Heap einer anderen
Anwendung zu schreiben. Man kann also nicht andere Programme durch
zufällige Schreibvorgänge zum Absturz bringen, sondern nur das eigene.
Verfasst: 29.12.2006 22:50
von DarkSoul
es geht ja hier auch um ein geschriebenes programm, das nicht läuft. Von einem fremden Programm ist ja auch nicht die rede

Verfasst: 30.12.2006 05:18
von STARGÅTE
ZeHa hat geschrieben: [...], unter welchem OS sie arbeiten...
XP-Home SP2
PS: siehe mein Profil
Wegen dem auf andere Speicher, andere Programm zugrafen hatte ich auch schon mal was getestet.
Die eine EXE hat ein speicher reserviert und dann den Position in eine Datei geschrieben.
Die zweite EXE sollte nun die Position aus der datei lesen und dann den Speicher an genau der gleiche stelle lesen.
Aber wie schon gesagt wurde geht das nicht, was ich persönlich schade finde, das würde die komunikation zwischen zwei EXEn verbessern

Verfasst: 30.12.2006 06:32
von Kaeru Gaman
dafür gibt es aber vorgesehene kommunikationsmethoden.
das zu unterbinden, dass zwei progs auf denselben speicher zugreifen können,
war ein hauptanliegen des multitasking.
schon der 286 war in seiner prozessorstruktur auf schutz ausgelegt.
es geht um sicherheit.
keiner mag, wenn fremdprogs einfach die Datensektion seiner programme manipulieren können.
damit kann man auch viel unsinn anrichten.