From: Kevin Bracey Date: Mon, 03 Oct 2016 17:09:48 GMT Subject: Re: [PATCH 1/3] add QSORT 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: > > 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