Do not use FillChar to initialize records
Prerequisites
- [X] This rule has not already been suggested.
- [X] This should be a new rule, not an improvement to an existing rule.
- [X] This rule would be generally useful, not specific to my code or setup.
Suggested rule title
NoFillCharOnRecords
Rule description
Using FillChar or ZeroMemory to initialize a record can evolve badly if one adds a managed field to the record. If the Delphi version supports it, it is suggested to use := Default(T) instead.
This was suggested as part of #149, but is too dependent on using a recent Delphi version. Making it a separate rule is more adequate.
Rationale
Using FillChar on a managed field can skip a refcount Release and result in large memory leaks.
Thanks for the suggestion!
Agreed that this is a very appropriate rule for new Delphi versions, where the Default intrinsic is unamibiguously the most correct tool for the job of default-initializing any variable.
I also like that you provided an example of why this code smell can lead to real-world bugs. 👍
FWIW using FillChar to initialize a record before use is not an issue because the compiler would have inserted appropriate code to initialize any managed fields into the prologue of the routine - the issue is using FillChar to clear an already used record that might contain some data in its managed fields.
FWIW using
FillCharto initialize a record before use is not an issue because the compiler would have inserted appropriate code to initialize any managed fields into the prologue of the routine - the issue is usingFillCharto clear an already used record that might contain some data in its managed fields.
Thanks for the additional information, Stefan. I think we should mention that subtlety of the behavior when writing the rule description.