This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: When is it legal to compare any pair of pointers?
- From: Daniel Jacobowitz <drow at false dot org>
- To: chris jefferson <caj at cs dot york dot ac dot uk>
- Cc: gcc at gcc dot gnu dot org
- Date: Tue, 13 Sep 2005 21:27:18 -0400
- Subject: Re: When is it legal to compare any pair of pointers?
- References: <4326A85A.8080001@cs.york.ac.uk>
On Tue, Sep 13, 2005 at 11:22:18AM +0100, chris jefferson wrote:
> I realise that according to the C++ standard it isn't legal to compare
> two pointers which are not from the same array. Is anyone aware of
> anything in g++ which would actually forbid this, and if there is any
> way of checking if will be valid?
>
> I want to be able to perform two main operations. Firstly to compare any
> pair of pointers with ==, and also to write code like:
>
> template<typename T>
> bool
> in_range(T* begin, T* end, T* value)
> { return (begin <= value) != (end <= value); }
>
> Where value may be a pointer not from the same array as begin and end.
>
> Apologises for sending this question to the main gcc list, but I want to
> submit such code to the debugging part of libstdc++-v3, and wanted to
> check if any optimisations may make use the fact comparing pointers from
> different arrays is undefined.
If two pointers to a T* are in the same array, their difference [in
bytes] must be 0 modulo sizeof(T). If they aren't, and sizeof(T) >
alignof(T), then it doesn't have to be. I'm pretty sure GCC can
optimize based on this information.
This bit binutils, in the form of a crash in a hash function on
Solaris. I think that was pointer subtraction, rather than comparison,
however.
Perhaps someone who remembers this problem more clearly than
I do can chip in if I've gotten it totally wrong.
--
Daniel Jacobowitz
CodeSourcery, LLC