https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103964

--- Comment #12 from Ilya Maximets <i.maximets at ovn dot org> ---
> (In reply to Ilya Maximets from comment #7)
> > One thing that is not clear to me is if the following code has an UB or not:
> > 
> >     struct member* pos;
> >     struct ovs_list start;
> > 
> >     pos = (struct member *)(void*)((uintptr_t)(&start) - 64);
> >     ovs_list_insert((void *)((uintptr_t)pos + 64), &member->elem);
> > 
> > ?
> >
> > This code works fine.  Basically, the question is: can we cast and store
> > the random (aligned) integer to a pointer type, if we're not going to
> > perform any kind of pointer arithmetic (using the integer arithmetic for
> > the ovs_list_insert) nor dereference it, unless it points to the actual
> > valid object?
> 

(In reply to Richard Biener from comment #8)
> That should be OK, yes.

(In reply to Jakub Jelinek from comment #9)
> It still creates a pointer out of something that doesn't point to such an
> object or points to some unrelated one, doesn't necessarily have sufficient
> alignment etc., so I think it is UB too, but perhaps the compiler at least
> now will handle it the way you expect.

I think, we'll try to re-write the loops to have 2 distinct variables, but
for the case we'll need the uintptr_t solution too as a backup plan, I have
one more question.  How bad is this:

    struct member* pos;
    struct ovs_list start;
    pos = (struct member *)(void*)((uintptr_t)(&start) - 64);

    struct ovs_list *list;
    list = (typeof(&pos->elem))(void *)((uintptr_t)pos + 64);

?

Basically, how much undefined is the 'typeof(&pos->elem)' construction?
(I just tried to prototype the part of the solution and I found that I need
a correct cast inside the macro, so the code will not look way too ugly.)

In general, I think, typeof() should not care about the actual value
of a pointer, but as we concluded the '&pos->elem' evaluation itself can
be harmful, so I don't know.

Reply via email to