[fpc-devel] Const optimization is a serious bug

Hans-Peter Diettrich DrDiettrich1 at aol.com
Thu Jul 7 12:24:23 CEST 2011


Chad Berchek schrieb:

> Thaddy wrote:
>> It is a contract between the compiler and the programmer in which it
>> is expected that the string will not be modified inside a procedure,
>> function or method.
> 
> This is the crux of the controversy. I realized this when I was writing 
> the original post, but did not mention it explicitly because I thought 
> it would come up anyway.
> 
> The difference between a feature and a bug is the specifications. Here 
> the specifications are the documentation. I have not found any 
> documentation in either FPC or Delphi that there is some implicit 
> contract whereby the programmer promises not to modify other variables 
> which happen to refer to the same instance as a const parameter.

*Aliasing* is a common problem, not restricted to const parameters.

A subroutine may e.g. free a global object, and replace it by its 
argument. Calling this subroutine with that global object results in an 
invalid reference in the global variable.


> To me, a const parameter means that 
> you cannot modify that parameter by pointing it to something else, nor 
> (in the case of strings and dynamic arrays) alter the contents by means 
> of said parameter. (Although, you can't really "alter" the contents of 
> the instance, as copy-on-write simply creates a whole new instance.) 
> That's what it means in other languages I've used, and nothing more.

In C "const" has several meanings, comparison with other languages is 
not a good idea.

In OPL "const" means that the argument will not be altered inside the 
subroutine, so that the compiler can apply some optimizations[1]. That's 
all. The compiler *can* check for e.g. illegal writes to an const 
parameter, but there is no such *obligation*, and it's known that the 
compiler can be fooled by trickery, in any language.

[1] E.g. const record parameters can be passed by reference, instead of 
passing a copy (by value) to the subroutine. Managed types can be passed 
without refcounting and associated try-finally constructs. But there 
exists no guarantee, which compiler will apply what optimization, under 
which conditions.


I do not defend critical optimizations in an compiler. E.g. it's known 
that managed types with a RefCount of zero should not be passed as const 
parameters, *when* inside the subroutine the RefCount can be increased 
and decreased again. Here the compiler may have a chance to report an 
*possibly* inappropriate use of "const".

DoDi




More information about the fpc-devel mailing list