sonar-delphi icon indicating copy to clipboard operation
sonar-delphi copied to clipboard

Do not use FillChar to initialize records

Open Chadehoc opened this issue 2 years ago • 3 comments

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.

Chadehoc avatar Dec 29 '23 08:12 Chadehoc

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. 👍

cirras avatar Dec 29 '23 08:12 cirras

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.

sglienke avatar Jan 10 '24 09:01 sglienke

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.

cirras avatar Jan 10 '24 11:01 cirras