On Fri, 8 Jul 2011, Alexander Klenin wrote:

On Fri, Jul 8, 2011 at 00:14,  <michael.vancann...@wisa.be> wrote:
Given that Borland never decided to 'fix' it, I'm inclined to think that
they also don't consider it a real problem, but rather a corner case
(if they are aware of it at all).

Hm. My testing indicates that Delphi has this fixed since at least D2007.

No, it did not.

program tests;

{$APPTYPE CONSOLE}

uses
  SysUtils;

Var
  A : ansistring;

Procedure DoIt(Const B : ansistring);

begin
  A:='Something else';
  Writeln(B);
end;

begin
  A:='Something';
  DoIt(A);
  Readln;
end.

Writes 'Something', because the pointer B points to a block that has not
yet been invalidated. It works by accident.

Changing it to:

program tests;

{$APPTYPE CONSOLE}

uses
  SysUtils;

Var
  A : ansistring;

Procedure DoIt(Const B : ansistring);

begin
  A:='Something else';
  Writeln(B+' aha !!');
end;

begin
  A:='Something';
  DoIt(A);
Readln; end.

The program crashes.

If you look at the generated assembler code, you'll see that no reference
count increasing is done in DoIt.

Michael.
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to