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