Re: [PATCH 21/24] revisions API: release "reflog_info" in release revisions()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 09 2022, Derrick Stolee wrote:

> On 3/9/2022 8:16 AM, Ævar Arnfjörð Bjarmason wrote:
>> Add a missing reflog_walk_info_release() to "reflog-walk.c" and use it
>> in release_revisions().
>> 
>> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx>
>> ---
>>  reflog-walk.c            | 26 ++++++++++++++++++++++++--
>>  reflog-walk.h            |  1 +
>>  revision.c               |  1 +
>>  t/t0100-previous.sh      |  1 +
>>  t/t1401-symbolic-ref.sh  |  2 ++
>>  t/t1411-reflog-show.sh   |  1 +
>>  t/t1412-reflog-loop.sh   |  2 ++
>>  t/t1415-worktree-refs.sh |  1 +
>>  8 files changed, 33 insertions(+), 2 deletions(-)
>> 
>> diff --git a/reflog-walk.c b/reflog-walk.c
>> index 8ac4b284b6b..4322228d122 100644
>> --- a/reflog-walk.c
>> +++ b/reflog-walk.c
>> @@ -7,7 +7,7 @@
>>  #include "reflog-walk.h"
>>  
>>  struct complete_reflogs {
>> -	char *ref;
>> +	const char *ref;
>>  	const char *short_ref;
>
> This seems like the opposite change from what I would
> expect, because the 'const' implies non-ownership.

Yes, I'll change it.

FWIW we've had recent discussions on this point & it's a bit
context-dependant. See
https://lore.kernel.org/git/patch-v2-1.1-e2a166a9733-20211021T201541Z-avarab@xxxxxxxxx/
and https://lore.kernel.org/git/xmqqlf2vbbl8.fsf@gitster.g/

I.e. the preferred pattern is:

 * Make it "char *" if it's your own private struct, because it's non-const
 * If it's a "public API" and it's not really "const char *", but we
   don't want the API user to think they can fiddle with it, make it
   "const char *" and cast it in the free().

In this case I think I just mixed those two up, or maybe I initially
wrote it before that was clarified. In this case it's our own private
struct within this file.

>> -	free(array->ref);
>> +	free((char *)array->ref);
>> +	free((char *)array->short_ref);
>
> This further makes the point that we should be keeping
> non-const versions so we can clearly document ownership.

*nod*

>> +static void complete_reflogs_clear(void *util, const char *str)
>> +{
>> +	struct complete_reflogs *array = util;
>> +	free_complete_reflog(array);
>> +}
>
> Is there a reason we don't do the cast inside?
>
> 	free_complete_reflog((struct complete_reflogs *)util);

I think we generally do that more often that not (although I should add
an extra \n) there. I.e. to immediately cast the void* into a variable.

I also find it handy when e.g. stepping through in a debugger, because
you'll have a variable you can inspect without de-referencing it every
time, and if the function uses "array" for something else in the future
it'll be less verbosity on the second use...




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux