[fpc-devel] Const optimization is a serious bug
Martin
fpc at mfriebe.de
Thu Jul 7 18:55:24 CEST 2011
On 07/07/2011 17:36, Alexander Klenin wrote:
> On Fri, Jul 8, 2011 at 03:23, Martin<fpc at mfriebe.de> wrote:
>
>> Yes, I use pointers, but it does not matter how I managed to change the
>> content of "s". All that matters is, that I broke the promise (assuming s
>> was declared const")
> No, the whole point it is that it *does* matter.
> Direct memory access lets you break anything --
> class members' visibility, callstack frames,
> built-in data structures like vtables, exceptions, refcounting, anything at all.
> That does not mean all those features are useless and we should go back
> to programming in assembler.
> That also does not mean we should allow arbitrary breakage of those
> features since "you can break them anyway".
>
> After all, you can break any string code the code much simpler:
> (PInteger(s)-1)^:=-1;
>
ok, so ansistring are the exception (or at least I will not search for
further ways), because their copy-on-write adds an extra layer of
protection.
but it still doesn't help.
Florian showed that the problem exist for ShortString.
In many cases the difference between ansi and short string s $H+/-.
Which means you move the breaking of your code into a compiler switch.
And also the example with the cached evaluation, would also apply to
let's say records.
So in your scenario, the "const param" would then mean:
- const x: record => a promise not to modify the original record, or
else you risk crashes and other errors
- const s: string => no promise, so you can do what you want
That doesn't make much sense either. Now const means different things
depending on the type ?
More information about the fpc-devel
mailing list