[fpc-pascal] Stack corruption setting UnicodeString Char
Tomas Hajny
XHajT03 at hajny.biz
Wed Oct 19 09:50:50 CEST 2011
On Wed, October 19, 2011 09:13, Felipe Monteiro de Carvalho wrote:
Hi,
> Usually when we work with PChars we do things like this to set the
> final terminator:
>
> var
> ansistr: ansistring;
> begin
> // Copy the originating string taking into account the specified length
> SetLength(ansistr, len+1);
> System.Move(source^, ansistr[1], len);
> ansistr[len+1] := #0;
> SetLength(ansistr, len);
>
> And it works fine. You get a string with correct length and a final #0
> terminator.
>
> Now, I simply tryed the same code for a unicodestring, and it corrupts my
> stack:
>
> procedure Unicode2AnsiMove(source:pwidechar;var
> dest:ansistring;len:SizeInt);
> var
> widestr: unicodestring;
> begin
> {$ifdef PASWSTRING_VERBOSE}WriteLn('Unicode2AnsiMove START');{$endif}
> // Copy the originating string taking into account the specified length
> SetLength(widestr, len+1);
> System.Move(source^, widestr[1], len*2);
> PWideChar(@widestr)[len] := #0; // <--- This corrupts the stack
> SetLength(widestr, len);
>
> I already fixed the problem by simply not setting this last widechar
> to #0, but now I got puzzled: Any ideas why this doesn't work?
>
> It crashes only a bit after this procedure, but I found that this was
> the statement which caused the problem.
Sorry for a silly question, but why the difference between the two
implementations (i.e. why not addressing the WideStr element directly
without the typecast)? Moreover, even if using the PWideChar, I believe
that the correct version would be without the '@' (i.e.:
PWideChar(widestr)[len] := #0), wouldn't it?
Tomas
More information about the fpc-pascal
mailing list