@hardfalcon:
[...] aber für mich schaut das defintiv danach aus, als ob on-the-fly-deklarierte Strings bei PB nicht nullterminiert wären (wäre Wünschenswert, dass das zukünftig im Handbuch klargestellt wird).
Auch ich bin dafür, dass sowas ins Handbuch gehört. Es gibt bei PB
leider vieles, was nicht dokumentiert ist oder überhaupt Sinn ergibt...
Trotzdem, "Strings" sind Nullterminiert...
Ich kanns nochmals ausführen:
Konstante (oder auch "statische" genannt) Strings werden in der
Data-Section der Exe gespeichert:
Code: Alles auswählen
section '.data' writeable
pb_public PB_DEBUGGER_LineNumber
dd -1
pb_public PB_DEBUGGER_IncludedFiles
dd 0
pb_public PB_DEBUGGER_FileName
db 0
align 4
public _SYS_StaticStringStart
_SYS_StaticStringStart:
_S1: dw 104,97,108,108,111,0
_S2: dw 100,117,0
(hier mit Unicode kompiliert, deshalb dw anstelle von db)
Warum sie nicht in einer readonly Section sind, kann man Fred fragen...
Bei jeder Zuweisung eines statischen Strings in eine normale Stringvar-
iable wird der statische String zuerst kopiert. Wenn man aber @"hallo"
schreibt, wird direkt der Pointer zum statischen String, hier z. B. "_S1"
verwendet:
Code: Alles auswählen
; *p = @"hallo"
MOV eax,_S1
MOV dword [p_p],eax
; *s = @"du"
MOV eax,_S2
MOV dword [p_s],eax
Man darf also nicht in die Pointer schreiben!
Übrigens wäre, wenn "hallo" kein "normaler" PB-String wäre, auch
ein solches Konstrukt nicht erlaubt:
denn PB übergibt an Len() und jede andere Funktion mit String-Argu-
menten nicht eine Kopie des Strings, sondern nur den Pointer auf
die Stringdaten. Erst in der Funktion wird das Stringargument kopiert,
was auch der Grund ist, weshalb man aus Geschwindigkeitsgründen
nie grosse Strings als Stringparameter an Funktionen übergeben sollte...
Das sieht in ASM so aus:
Code: Alles auswählen
; i = Len("hallo")
PUSH dword _S1
CALL PB_Len_UNICODE
ADD esp,4
MOV dword [v_i],eax
Len() erwartet ja einen normalen PB-String, weshalb auch _S1 ein
normaler PB-String sein muss, weshalb "hallo" ein normaler PB-String
sein muss, weshalb "hallo" nullterminiert ist. q.e.d.
@cxAlex: Ich glaube dir sogar, dass da ev. noch ein Bug ist. Aber ts-soft
wird es nur als Bug akzeptieren, wenn du mit einer nicht-Beta von
Windows testest... Und auch nicht in VMware
