[fpc-pascal] Stack corruption setting UnicodeString Char

Felipe Monteiro de Carvalho felipemonteiro.carvalho at gmail.com
Wed Oct 19 09:13:12 CEST 2011


Hello,

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.

-- 
Felipe Monteiro de Carvalho



More information about the fpc-pascal mailing list