Re: [RFC PATCH 03/15] reftable: don't memset() a NULL from failed malloc()
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Jun 4, 2022, 00:54 UTC
- Message-ID
- <220604.86pmjpw8h0.gmgdl@evledraar.gmail.com>
- In-Reply-To
- <693ed3c3-535e-9eae-9fd7-ca612ebf6943@web.de>
On Sat, Jun 04 2022, René Scharfe wrote:
Show 44 quoted lines
> Am 03.06.22 um 20:37 schrieb Ævar Arnfjörð Bjarmason:
>> Return NULL instead of possibly feeding a NULL to memset() in
>> reftable_calloc(). This issue was noted by GCC 12's -fanalyzer:
>>
>> reftable/publicbasics.c: In function ‘reftable_calloc’:
>> reftable/publicbasics.c:43:9: error: use of possibly-NULL ‘p’ where non-null expected [CWE-690] [-Werror=analyzer-possible-null-argument]
>> 43 | memset(p, 0, sz);
>> | ^~~~~~~~~~~~~~~~
>> [...]
>>
>> This bug has been with us ever since this code was added in
>> ef8a6c62687 (reftable: utility functions, 2021-10-07).
>>
>> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
>> ---
>> reftable/publicbasics.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/reftable/publicbasics.c b/reftable/publicbasics.c
>> index 0ad7d5c0ff2..a18167f5ab7 100644
>> --- a/reftable/publicbasics.c
>> +++ b/reftable/publicbasics.c
>> @@ -40,6 +40,8 @@ void reftable_free(void *p)
>> void *reftable_calloc(size_t sz)
>> {
>> void *p = reftable_malloc(sz);
>> + if (!p)
>> + return NULL;
>> memset(p, 0, sz);
>> return p;
>> }
>
> We discussed this before, in
> https://lore.kernel.org/git/RFC-patch-2.2-364d1194a95-20220415T101740Z-avarab@gmail.com/
>
> If this code was actually used by Git and still not handling allocation
> failures then I'd propose something like the below instead.
>
> Next I'd probably try to convert reftable_calloc() calls to a variant
> that takes size and count separately -- like calloc(3) does -- to avoid
> unchecked multiplication.
>
> --- >8 ---
> Subject: [PATCH] reftable: remove reftable_set_alloc()I think this is a much better direction than my more narrow fix, and would be happy to see it queued up.
To your comment here & some others (e.g. FREE_AND_NULL()): I was really trying to focus on narrowly addressing these -fanalyzer issues without digressing into the larger topics "what is this code *really* doing, and does it make sense?". It was pretty unavoidable in 13/15 though.
Which isn't to say that I shouldn't fix some of it, e.g. your s/return/BUG()/ suggestion, but I think it's best to view these patches with an eye towards us already having these issues, and in most cases making -fanalyzer happy is a small cost.
And by doing so and getting a "clean build" we'll be able to turn it on in CI, and thus notice when we run into new -fanalyzer issues.