[fpc-devel] ref count issue with out param
Martin Frb
lazarus at mfriebe.de
Sat Jun 13 06:04:15 CEST 2015
Reading
http://forum.lazarus.freepascal.org/index.php/topic,28740.msg180163.html#msg180163
and http://bugs.freepascal.org/view.php?id=28279
I did some tests and found something related, that I believe to be a
bug. 2.6.4 and trunk (few weeks old)
Could someone please confirm?
The line
s1 := copy(x,2,3)+'x';
creates a string with a refcount of 1 (for some reason if only using
copy, but not +'x', then the ref count of S1 is 2)
The below outputs
0
0
0
-252645136
The 2nd call
Foo2(s1,s1);
gets an invalid argument for "b"
The asm (trunk) is
.Ll26:
# [23] Foo2(s1,s1);
movl U_$P$PROJECT1_$$_S1,%ebx
movl $U_$P$PROJECT1_$$_S1,%eax
call fpc_ansistr_decr_ref
movl $U_$P$PROJECT1_$$_S1,%eax
movl %ebx,%edx
call P$PROJECT1_$$_FOO2$ANSISTRING$ANSISTRING
.Ll27:
ebx is a temp copy of s1, but then f1 becomes nil, and ebx points to
freed memory.
program Project1;
procedure Foo1(a: AnsiString; out b: AnsiString);
begin
WriteLn(length(a)); WriteLn(length(b));
b := 'a';
end;
procedure Foo2(out a: AnsiString; b: AnsiString);
begin
WriteLn(length(a)); WriteLn(length(b));
b := 'a';
end;
const x: AnsiString = 'abcde';
var s1: AnsiString;
begin
s1 := copy(x,2,3)+'x';
Foo1(s1,s1);
s1 := copy(x,2,3)+'x';
Foo2(s1,s1);
ReadLn;
end.
More information about the fpc-devel
mailing list