On 12 June 2014 10:40, Florian Weimer wrote:
> In GCC 4.9, we have optimizations that make use of non-null annotations, at
> least for removing null pointer checks.  Some libc functions are annotated
> with it, such as qsort, memcpy, memset, memcmp.

Yep, as described at https://gcc.gnu.org/gcc-4.9/porting_to.html

> On the other hand, it is unspecified if the data() member of std::vector
> returns null pointer if empty() returns true.
>
> As a result, code like this is invalid if the functions are ever called with
> empty vectors:
>
>   void clear(std::vector<char> &vec)
>   {
>     memset(vec.data(), '\0', vec.size());
>   }
>
>   int comparefn(void *, void *);
>
>   void sort(std::vector<T> &vec)
>   {
>     qsort(vec.data(), vec.size(), sizeof(T), comparefn);
>   }
>
> I think this is quite surprising.

I don't see why it's much different to passing a pointer that might be
null. You need to check.

>  What can we do about it?

How common is it to use std::vector with qsort, rather than
std::sort(vec.begin(), vec.end()), which does the right thing?

We could make vector::data() guarantee a non-null pointer with
_FORTIFY_SOURCE, but I'd rather not do so in "unfortified" code. Some
users would object to the extra check needed.

Reply via email to