Re: [PATCH 1/3] add QSORT
- From
Kevin Bracey <kevin@bracey.fi>
- Date
- Oct 3, 2016, 17:09 UTC
- Message-ID
- <57F290DC.5080303@bracey.fi>
- In-Reply-To
- <83398160-555f-adab-6b1e-3283c533b5ff@web.de>
On 01/10/2016 19:19, René Scharfe wrote:
Show 13 quoted lines
> > It's hard to imagine an implementation of qsort(3) that can't handle > zero elements. QSORT's safety feature is that it prevents the compiler > from removing NULL checks for the array pointer. E.g. the last two > lines in the following example could be optimized away: > > qsort(ptr, n, sizeof(*ptr), fn); > if (!ptr) > do_stuff(); > > You can see that on https://godbolt.org/g/JwS99b -- an awesome website > for exploring compilation results for small snippets, by the way. >
Ah, second attempt. Originally misread the original code, and didn't understand what it was doing.
I get it now.
A nasty trap I hadn't been aware of - I was under the impression NULL + zero length was generally legal, but the C standard does indeed not give you a specific out for NULL to library functions in that case.
As such, NULL checks can still be elided even with your change. If you effectively change your example to:
if (nmemb > 1)
qsort(array, nmemb, size, cmp);
if (!array)
printf("array is NULL\n");array may only be checked for NULL if nmemb <= 1. You can see GCC doing that in the compiler explorer - it effectively turns that into "else if". To make that check really work, you have to do:
if (array)
qsort(array, nmemb, size, cmp);
else
printf("array is NULL\n");So maybe your "sane_qsort" should be checking array, not nmemb.
Kevin