[fpc-devel] Const optimization is a serious bug

michael.vancanneyt at wisa.be michael.vancanneyt at wisa.be
Thu Jul 7 17:29:08 CEST 2011



On Fri, 8 Jul 2011, Alexander Klenin wrote:

> On Fri, Jul 8, 2011 at 00:14,  <michael.vancanneyt at 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.



More information about the fpc-devel mailing list