Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2008-01

Re: One more issue with string function results (hopefully, the last)

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Peter Vreman
Show quoted text 12 lines
Hello, Ran into it while compiling Lazarus. It appears that, while many sophisticated checks are done in tcallnode.maybe_create_funcret_node, the obvious case when function result destination is one of the function's arguments, is not checked. To be honest, I noticed that earlier for the case of s := Copy(s, ...), but was thiniking that there is some compiler magic around Copy(). Delphi also appears to be smart enough to omit temps in case of s := copy(s,...). Anyway, since copy() assigns its result once before exiting, it works fine. Things go wrong when the function is tries to access its argument after modifying the result, like in the attached example.

This issue is caused by your own patch to change the ansistring code to use pass the result by reference.

Original code (using current 2.2.1) was:

# [21] s := foo(s); // This one failes movl -4(%ebp),%eax
call P$PROGRAM_FOO$ANSISTRING$$ANSISTRING
movl %eax,%ebx
leal -4(%ebp),%eax
call FPC_ANSISTR_DECR_REF
movl %ebx,-4(%ebp)

The new code since r9718 is:

# [21] s := foo(s); // This one failes leal -4(%ebp),%edx
movl -4(%ebp),%eax
call P$PROGRAM_FOO$ANSISTRING$$ANSISTRING

Here you can see that the result is at the same location as the parameter. In the original code the value is only assigned to the original location after the call.

The quick-solution is simple: revert r9718 until it works.

Peter

Reply by email