[patch] proposed fix for libstdc++/59829

Jonathan Wakely jwakely.gcc@gmail.com
Mon Jan 27 20:35:00 GMT 2014

On 27 January 2014 20:12, Marc Glisse wrote:
> On Mon, 27 Jan 2014, Jonathan Wakely wrote:
>> This is the best I've come up with to avoid dereferencing an invalid
>> pointer when calling vector::data() on an empty vector.
>> For C++03 we reurn the vector's pointer type, so can just return the
>> internal pointer, but for C++11 we need to convert that to a raw
>> pointer, which we do by dereferencing, so we must check if it's valid
>> first.
> For comparison, libc++ has 2 paths. If pointer really is a pointer, it just
> returns it, no need to pay for a comparison in that case. And otherwise, it
> calls _M_start.operator-> and crosses its fingers. There is a helper
> function doing that used throughout the library.

Ah yes, I remember Howard posting a get_raw_pointer() function to the
reflector that used operator->() on user-defined types ... I don't
really like calling that on a potentially invalid pointer though. The
user-defined pointer type in my new testcase could just as easily
throw if operator-> is called on an invalid pointer.  As Paolo also
mentioned avoiding the branch for built-in pointers I'll do that.

(Sorry for the double-post, the first one seemed to disappear and I
wasn't sure if it really happened or not, so wrote it again!)

More information about the Libstdc++ mailing list