You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This should be a new rule, not an improvement to an existing rule.
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.
The text was updated successfully, but these errors were encountered:
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 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.
Thanks for the additional information, Stefan.
I think we should mention that subtlety of the behavior when writing the rule description.
Prerequisites
Suggested rule title
NoFillCharOnRecords
Rule description
Using
FillChar
orZeroMemory
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 refcountRelease
and result in large memory leaks.The text was updated successfully, but these errors were encountered: