[fpc-pascal] SetLength warnings - request

Jonas Maebe jonas at freepascal.org
Mon Dec 31 10:04:36 CET 2018


On 2018-12-31 02:54, Martok wrote:
>> There is a hint for such parameters even though the compiler knows 
>> they
>> always contain a valid value, because valid in the sense of "won't 
>> crash
>> the program" is not the same as "this is what the programmer 
>> intended".
> 
> Are you baiting me, or was that accidental? ;-)

I'm 100% serious about the above. Code should be explicit, not implicit. 
It's up to the compiler to remove unnecessary code based on what it 
knows is implicitly guaranteed. The programmer should only have to focus 
on the algorithms and on making their code as explicit/clear as 
possible. Removing initialisations based on the type of variables (which 
then may have to be re-added in case the type or usage changes) does not 
help with that.

In that sense, the optimisation capabilities of a compiler are quite 
important for the quality of the code that people write, because a 
better optimiser means that (some) people are less inclined to mangle 
their code and "tune" it to implementation details in order to coax the 
compiler into generating the code they want to see.

>> 1) Dynamic arrays are initialised with nil, but that is an
>> implementation detail
> 
> Is it, though? Global variables and instance fields are zero-filled, 
> local
> variables as if the local variable block was a record passed to 
> Initialize()
> (so, recursively zeroing managed fields). Although it is never spelled 
> out, the
> Delphi manual heavily implies this.
> I would guess most if not all pascal programmers wrote code that relies 
> on that
> at some point.

Yes, and that indeed would make it very hard to change any of that 
without breaking any code. The fact that people rely on implementation 
details does not make them any less of an implementation detail. In this 
context, "detail" does not mean "less significant fact or item" but 
"individual fact or item".

In general, the Turbo/Borland/Free Pascal community is very bad in terms 
of relying on implementation details. This is normal if you only have 
one dominant compiler. It's the same for individual companies (= 
mini-communities) that only use e.g. Visual C++ or GCC.

> @MvC: I'll come up with some examples and add it to the Portability 
> page, since
> the different result variable initialization rules already are a bit
> of an issue.

Since such code will also give wrong results in Delphi under certain 
circumstances (which most Delphi programmers probably don't know, 
because usually string result variables _are_ indeed nil there), this is 
a perfect illustration of my first point. Especially since unless you 
are clairvoyant, it is impossible to know that your function will never 
be used in the future in a way that will cause the result to be 
non-empty from the start.


Jonas



More information about the fpc-pascal mailing list